实施例1:
Input: nums = [2,7,11,15], target = 9 <br>
Output: [0,1] <br>
说明:因为nums[0] + nums[1] == 9,所以我们返回[0,1]。
实施例2:
Input: nums = [3,2,4], target = 6 <br>
Output: [1,2] <br>
实施例3:
Input: nums = [3,3], target = 6 <br>
Output: [0,1] <br>
制约因素:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
Only one valid answer exists.
这是我从solutions和youtube上得到的代码:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
//uptil here, it is given
int *returnArr=malloc(2 * sizeof(int));
*returnSize=2; //WHY
int i,j;
for(i=0;i<numsSize-1;i++){
for(j=i+1;j<numsSize;j++){
if(nums[i]+nums[j]==target){
returnArr[0]=i;
returnArr[1]=j;
return returnArr; //gets out of loop if we encounter return so program is faster if return is here too;
}
}
}
return returnArr; //here return returnArr is mandatory;
}
所以stackoverflow告诉我,我应该在这里包含非代码文本,它不让我没有它就发布,我花了很多时间缩进代码,所以,是的,这是解决方案的代码,工作,并给出正确的输出,但我只是想知道为什么我们必须把*returnSize=2;
和为什么我们不能只是声明一个数组returnArr
像int returnArr[100];
-为什么leetcode暗示它应该被错置?
我可以不在函数中声明元素吗?这些元素可以不发送到主函数吗?但是在这里,它只是返回数组的值,而不是数组本身?但即使这样,我们不能返回数组吗?
P.S.我是一个初学者谁已经学会(不掌握)DSA,我花了这么多时间试图理解,但觉得我是浪费时间:(
1条答案
按热度按时间yrdbyhpb1#
为什么我们必须 *returnSize=2;在C语言?
您必须返回
*returnSize
中数组中的元素数,因为调用者需要它。(a)Leetcode没有在problem page上说明这个要求,这是Leetcode的质量问题。
(b)这一要求没有理论上的理由;由于在这个问题中返回的大小固定为两个元素,所以通过显式地返回它没有获得任何信息。返回大小可以符合Leetcode中的常见模式,该模式用于其中返回大小不固定的其他问题。
为什么我们不能像int returnArr[100]那样声明一个数组returnArr;- 为什么leetcode暗示它应该被错置?我可以不在函数中声明元素吗?
当你在函数中声明
int returnArr[100];
时,声明的对象有 * 自动存储时间 *。这意味着从与声明相关联的程序执行中的时间直到包含声明的代码块的执行结束为止,为它保留存储器。该执行将在函数返回或更早时结束。那么内存就不再为对象保留,它可以被重新用于其他目的。所以这个函数的调用者不能依赖于可用的内存。实际上,当int returnArr[100];
在函数内部声明时,您无法将其返回给调用函数。这些元素可以不发送到主函数吗?
不,不可靠。
但是在这里,它只是返回数组的值,而不是数组本身?
语句
return returnArr;
不返回数组。当一个数组在C中的表达式中使用时,除了作为sizeof
的操作数、&
的操作数或用于初始化数组的字符串文字外,它会自动转换为指向其第一个元素的指针。所以return returnArr;
实际上是return &returnArr[0];
。它返回一个指向returnArr
使用的内存的指针。然而,如上所述,在函数返回后,该内存没有为returnArr
保留,因此指针无效。但即使这样,我们不能返回数组吗?
没有