1.两数之和
2018-05-10 本文已影响0人
无名的殇
leetcode算法学习,打算每日1篇
自己写的代码太low就不上了,主要是对最优代码的注释和自己的小小理解
思路
1.确定取值范围
2.范围内查看有没有匹配的数字
代码
int* twoSum(int* nums, int numsSize, int target) {
//第1步:找到最小的数
int min = 2147483647;
int i = 0;
for (i = 0; i < numsSize; i++) {
if (nums[i] < min)
min = nums[i];
}
//第2步:确定取值范围
int max = target - min;
int len = max - min + 1;
int *table = (int*)malloc(len*sizeof(int));
int *res = (int*)malloc(2*sizeof(int));
for (i = 0; i < len; i++) {
table[i] = -1;
}
//第3步:*确认符合条件数字位置
for (i = 0; i < numsSize; i++)
{
if (nums[i]-min < len) {//3.1:是否在范围内
//3.3:这是第3步,因为一开始不会执行,和第二步相呼应。
if (table[target-nums[i]-min] != -1)//需求值-当前值获得的下标如果能在数组内找到,则证明找到了答案
{
res[0] = table[target-nums[i] - min];
res[1] = i;
return res;
}
table[nums[i] - min] = i;//3.2:减去min使下标能存放进数组
}
}
free(table);
return res;
}