给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]我写的8ms解法:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* nums, int numsSize, int target) {
int a[1000000] = {0};
int *b;
b = (int*)malloc(sizeof(int)*2);
const int min = 100000;
for (int i = 0; i < numsSize; i++){
nums[i] += min;
}
int k = 0;
target += 2*min;
for (int i = 0; i < numsSize; i++){
if (a[target - nums[i]] > 0){
b[0] = a[target - nums[i]] - 1;
b[1] = i;
k = 1;
}
if (k == 1) break;
a[nums[i]] = i + 1;
}
return b;
}
最快有0ms的,看了发现是一些常数上的优化,orz:
int* twoSum(int* nums, int numsSize, int target) {
int min = 2147483647;
int i = 0;
for(i = 0; i< numsSize; i++){
//numsSize == ArrayLen
if(nums[i]<min)
min = nums[i];
}
int max = target - min;
int len = max - min+1;
int *table = (int*)malloc(len*sizeof(int));
int *indice = (int*)malloc(2*sizeof(int));
for(i = 0; i<len; i++){
table[i] = -1;
}
for(i = 0; i<numsSize; i++){
if(nums[i]-min <len){
if(table[target-nums[i]-min]!=-1){
indice[0] = table[target-nums[i]-min];
indice[1] = i;
return indice;
}
table[nums[i]-min] = i;
}
}
free(table);
return indice;
}
不过更一般的哈希还是得学啊!!!!