题目:
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.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
分析:一开始直接想到使用循环遍历,但是算法繁杂度是n的平平方,明显太简单,不能满足逼格,因此,放弃掉了,后来又没能想出来更好的解法,懵逼了,后来四处查了查,弄懂了,然后分享给大家:
首先从一个简单的问题出发:对于两个升序数组合并为一个升序数组,一次遍历,如何解决?借助图像嘛:
通过图像我们可以发现,很多时候我们可以通过同时移动两部分以实现一次遍历,这里的结题思路就是通过先排序再前后同时移动,以实现一次遍历就可以找出:
第一次比较后
1便是第一个数,而后上面一个数组往后移,就是2比较,很自然,2就是第二个,当5比较的时候
3便往后移,5不动,直到下面数组的值大于等于5.
利用这种思想,我们来解决本题。
/*函数定义*/
int* twoSum(int* nums,int numsSize,int target) {
/*num是排序后数组的首地址,numSize是数组长度,target是两数之和*/
}
/*首先开辟空间*/
int *arr = (int *)malloc(sizeof(int)*2);
int low=0,high=numsSize-1;//定义好只向头部的指针和指向尾部的指针
/*开始循环比较*/
while(target != nums[low]+nums[high])
{
if(target > nums[low]+nums[high])
{
low++;
}
else
{
high--;
}
/*防止low == high,死在循环里面了*/
if(low == high)
{
break;
}
}
/*循环完,赋值*/
if(low != high)
{
arr[0] = nums[low];
arr[1] = nums[high];
}
else
{
arr[0] = nums[low];
arr[1] = arr[0];
}
/*这既是C的思路与做法*/
Java做法是用哈希表,目前我还不会,以后做出来了补上