Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].
我的daim
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* nums, int numsSize, int target) {
int i,j,mark = 0,minus = 1;
if(target < 0) minus = -1;
int *indices = (int*)malloc(sizeof(int) * 2);
for(i=0;i<numsSize;i++){
if(minus * nums[i] > minus * target) continue;
for(j=i+1;j != i && j<numsSize;j++){
if(nums[i] + nums[j] == target){
indices[0] = i;
indices[1] = j;
mark = j;
break;
}
}
if(mark) break;
}
return indices;
}
别人的代码,将之前访问过的元素存在数组中,O(n),虽然很快,但是正式的做法应该是存在Hash表里面。
int* twoSum(int* nums, int numsSize, int target) {
int _[100001] = {0}, *index_plus_one = _ + 50000;
for (int i = 0; i < numsSize; i++) {
int rest = target - nums[i];
if (index_plus_one[rest]) {
int *ans = malloc(sizeof(int) * 2);
ans[0] = i;
ans[1] = index_plus_one[rest] - 1;
return ans;
}
else
index_plus_one[nums[i]] = i + 1;
}
return NULL;
}