题目描述:
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
解题思路:我原先想的是先将数组的值保存到一个二维数组中,其中第一列保存值,第二列保存原来数组的下标,然后对第一列进行排序,第一列经排序后按照从小到大的顺序表示,第二列存储的还是这些值原先所对应的下标,然后我们用j从右往左开始和target进行比较,直至找到第一个比target小的值,然后用i从左往右取值和第一个比target小的值相加,然后和target进行比较,如果等于,则返回,如果比target小则i的值加1,如果比target大,则j的值减1。代码如下:
int* twoSum(int* nums, int numsSize, int target) { int *num; int i,j,temp; num=(int *)malloc(sizeof(int)*2); int (*Nums)[2]=(int(*)[2])malloc(sizeof(int)*numsSize*2); for(i=0;i<numsSize;i++){ Nums[i][0]=nums[i]; Nums[i][1]=i; } for(i=0;i<numsSize;i++){ for(j=i+1;j<numsSize;j++){ if(Nums[i][0]>Nums[j][0]){ temp=Nums[i][0]; Nums[i][0]=Nums[j][0]; Nums[j][0]=temp; temp=Nums[i][1]; Nums[i][1]=Nums[j][1]; Nums[j][1]=temp; } } } for(j=numsSize-1;j>=1;j--){ for(i=0;i<j;i++){ if((Nums[i][0]+Nums[j][0])==target){ num[0]=Nums[i][1]; num[1]=Nums[j][1]; return num; } else if((Nums[i][0]+Nums[j][0])<target) continue; else if((Nums[i][0]+Nums[j][0])>target) break; } } return 0; }
这个时间复杂度为o(n^2),有很多值得改进的地方,比如,在排序的时候,我选用的是冒泡排序,如果换用快速排序,则时间复杂度会降低很多,再者当我对这个有序数组进行查找的时候,使用的也是双重循环,所以复杂度也是o(n^2),这个地方其实也是可以进行优化的。
后来想想直接来个像冒泡排序那样的双重循环,也能解决问题吧,于是就有了下面的代码。
int* twoSum(int* nums, int numsSize, int target) { int *num; int i,j; num=(int *)malloc(sizeof(int)*2); for(i=0;i<numsSize;i++){ for(j=i+1;j<numsSize;j++){ if(nums[i]+nums[j]==target){ num[0]=i; num[1]=j; return num; } } } return 0; }欢迎留言评论交流