题目:给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
说明:
返回的下标值(index1 和 index2)不是从零开始的。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。(注意这个条件)
- 第一遍看题的时候我并没有注意到那个说明,//哭。然后看到题的一瞬间我就想起的第一天我做的那个题的 桶思想,然后我就顺着这个往下想,编写。然后我因为没有看到那个说明所以写的是又很多个答案的情况下。(同时还是因为官网上执行又错误,所以我展示的是用DEV C++ 上编写的代码,并且例子输出正确。)
#include<stdio.h>
#include<algorithm>
using namespace std;
int k = 0;
int* twoSum(int* numbers, int numbersSize, int target, int* r){
int C[target + 1];//桶 存入符合条件的数
int M[100] = {0};//桶 存入符合条件的数字的位数
int i,j;
for(i = 0;i < target + 1;i ++){
C[i] = 0;//初始化
}
for(i = 0;i < numbersSize;i ++){
if(numbers[i] >= target) break;//当数比目标数要大的情况下,跳出,因为是升序数组
C[numbers[i]] = numbers[i];//存入数
M[numbers[i]] = i + 1;//存入位置
}
for(i = 0,j = target;i < j;i ++,j --){
if(C[i] + C[j] == target){//桶里的数对应位置前后相加为目标数的
r[k] = M[C[i]];
k ++;
r[k] = M[C[j]];
k ++;
}
}
return r;
}
int main(){
int n,target;
int numbers[100],r[100];
scanf("%d",&n);
for(int i = 0 ;i < n;i ++){
scanf("%d",&numbers[i]);
}
scanf("%d",&target);
twoSum(numbers,n,target,r);
sort(r,r + k);//排序
for(int i = 0;i < k;i ++){
printf("%d ",r[i]);
}
return 0;
}
- 然后因为官网执行错误,我又继续看题,根据提示,使用了双指针法。(并且注意到了那个说明,但是还是执行错误)
我看一个网友的代码是这样的///(菜鸟大哭)表示试了好几次, *returnSize = 2; int *res = calloc(2,sizeof(int));感觉这两句换个位置执行就会发生一些错误。。。。。菜鸟表示不理解。(唉,好像涉及到返回一个数组的我的代码在官网上都执行错误了。。。。)。
int* twoSum(int* numbers, int numbersSize, int target, int* returnSize){
int low = 0,high = numbersSize - 1;
while(low < high){
int sum = numbers[low] + numbers[high];
if(sum > target){
high -= 1;
}else if(sum < target){
low += 1;
}else{
break;
}
}
*returnSize = 2;
int *res = calloc(2,sizeof(int));
res[0] = low + 1;
res[1] = high + 1;
return res;
}