这是一个简单的题,但是我一开始以*returnSize作为结果集返回,始终得不到需要的结果,
其实很明显returnSize本来翻译过来的意思就是返回结果集的大小而不是结果集。这里是暴力解法。
思想很简单,就是从数组中的第一个数开始,和其中剩下的其他的数相加看能否满足想要的target。
int* twoSum(int* nums, int numsSize, int target, int* returnSize){ int* res = (int *)malloc(sizeof(int) * 2); int i,j; for (i = 0; i < numsSize-1; i++) { for(j = i + 1; j < numsSize; j++) { if(nums[i] + nums[j] == target) { *returnSize = 2; res[0] = i; res[j] = j; return res; } } } *returnSize = 0; return res; }
这里是完整的两种解法
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<vector> #define IL inline int cmp(const void *a,const void *b) { return *(int *)a-*(int *)b; } int z; /* LeetCode第1题 */ /*暴力解法 O(n^2): 从第一个数开始,将其与后面的每一个数相加,看能否等于target */ int* twoSum1(int* nums, int numsSize, int target, int* returnSize){ int* res = (int *)malloc(sizeof(int) * 2); int i,j; for (i = 0; i < numsSize-1; i++) { for(j = i + 1; j < numsSize; j++) { if(nums[i] + nums[j] == target) { *returnSize = 2; res[0] = i; res[j] = j; return res; } } } *returnSize = 0; return res; } /* 排序后首位同步检测 O(nlogn): 先将数组排序,然后首尾检测, 若首尾之和大于target,则说明需要一个小一点的数看是否能够满足和等于target,于是右边往左移一个数 若首尾之和小于target,则说明需要一个大一点的数看是否能够满足和等于target,于是左边往右移一个数 */ int* twoSum2(int* nums, int numsSize, int target, int* returnSize){ int* res = (int *)malloc(sizeof(int) * 2); int* newNums = (int*)malloc(sizeof(int) * numsSize); int z; for(z = 0; z < numsSize; z++) { newNums[z] = nums[z]; } qsort(newNums,numsSize,sizeof(int),cmp); int i = 0; int j = numsSize - 1; int k,sum; sum = newNums[i] + newNums[j]; while(newNums[i] + newNums[j] != target) { sum = newNums[i] + newNums[j]; if(sum < target) i++; else if(sum > target) { j--; } if(i == j) { *returnSize = 0; return res; } } *returnSize = 2; for(k = 0; k < numsSize; k++) { if(nums[k] == newNums[i]) { res[0] = k; break; } } for(k = numsSize - 1; k >= 0; k--) { if(nums[k] == newNums[j]) { res[1] = k; break; } } free(newNums); return res; } // 测试 int main() { int i; int nums[] = {3,2,4}; int len = strlen(nums); int target = 6; int* returnSize = (int *)malloc(sizeof(int)); int* res; res = twoSum2(nums,len,target,returnSize); for(i = 0; i < *returnSize; i++) { printf("%d ",res[i]); } return 0; }