【发布时间】:2021-01-12 17:23:11
【问题描述】:
我正在尝试解决这个问题:
给定一个整数数组 nums 和一个整数目标,返回这两个数字的索引,使它们相加为目标。
您可以假设每个输入都只有一个解,并且 您不能两次使用相同的元素。
您可以按任意顺序返回答案。
Example 1:
Input: nums = [2,7,11,15], target = 9 Output: [0,1] Output: Because
nums[0] + nums[1] == 9, we return [0, 1].
我的代码是:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
*returnSize = malloc (2 / sizeof(int));
for (int i=0; i<numsSize; i++)
{
for (int j=0; j< numsSize; j++)
{
if (i != j)
{
if(nums[i] + nums[j] == target)
{
returnSize[0] = i;
returnSize[1] = j;
}
}
}
}
return returnSize;
}
如您所见,他们在代码开头添加了注释以给出提示,但我不知道我应该如何在这里使用 malloc() 函数以及确切的原因。 如您所见,我尝试使用 malloc() 函数添加第一行,这只是我在网上阅读的内容并认为这会有所帮助,因为我认为它为数组分配了 2 个可用空间,这意味着我'将有足够的内存和空间在其中插入 2 个整数。 但它不起作用。
我很高兴听到我应该如何以及出于什么原因在这里使用 malloc 函数, 谢谢。
【问题讨论】:
-
你需要乘,而不是除。
-
2 / sizeof(int)将导致0,因为sizeof(int)可能是4 或8。正如tkausl 所说,您需要在这里相乘。 -
旁白:您可以通过在
i+1而不是 0 开始j来加快代码速度。这也会使i != j测试变得多余。您还可以在为目标值的第一个匹配项填充数组后立即返回指向该数组的指针,而不是继续循环以查找其他匹配项。 -
@IanAbbott 谢谢,你是对的。我认为从 i+1 开始 j 会取消可能的匹配,这就是为什么我需要从 0 开始运行以覆盖整个数组。关于您的第二个提示,您是在谈论在第二个循环中添加“return returnArray”以便它立即返回值吗?
-
是的,在
returnArray[0] = i;returnArray[1] = j;之后,可以加return returnArray;直接返回。您仍然需要在函数末尾添加return,但只有在没有匹配项时才能达到。 (您可以做一些事情来表明没有找到匹配项,例如将数组元素设置为 -1 或释放内存并返回NULL。)
标签: arrays c loops integer malloc