两数之和:给定一个整数数组,找出其中两个数相加等于目标值
原文出处:https://blog.csdn.net/wz2292667460/article/details/79358044
有三种思路:
第一个思路:遍历数组i从第一个数开始,j从(i+1)开始,直到找到合适的值。这个算法的时间复杂度为O(n2),空间复杂度为O(1)。
第二个思路:在前一个算法的基础上降低时间复杂度。我们可以将数组排序,然后定义两个指针,一个指针i从左向右,另一个从j右向左。
①如果data[i]+data[j] < tager ,则++i
②如果data[i]+data[j] > tager ,则–j
③如果data[i]+data[j] > tager ,则就找到
由于排序的最佳时间复杂度为O(nlogn),两个指针的遍历时间复杂度为O(n)。所以总的时间复杂度为O(nlogn)
第三个思路:
希望通过O(n)的时间复杂度完成要求。
第一遍遍历:将(target-a)和i 作为键值对,存入Hash表,遍历时间复杂度为O(n),
第二遍遍历:查询在Hash表中有和当前数相同的key,每次查询时间复杂度为O(1),遍历时间复杂度为O(n),
总的时间复杂度是O(2n)。
第一种(C):
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* nums, int numsSize, int target) {
int *res=(int*)malloc(2*sizeof(int));
for(int i=0;i<numsSize-1;i++)
for(int j=i+1;j<numsSize;j++)
{
if(nums[i]+nums[j]==target)
{
res[0]=i;
res[1]=j;
}
}
return res;
}
第三种方法(JAVA):返回下标
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map =new HashMap();
int []a=new int[2];
for(int i=0;i<nums.length;i++)
{
map.put(target-nums[i],i);
}
for(int i=0;i<nums.length;i++)
{
//可能存在一个数x,满足x*2=target,i!=map.get(nums[i])可以避免
if(map.containsKey(nums[i])==true && i!=map.get(nums[i]))
{
a[0]=i < map.get(nums[i])?i:map.get(nums[i]);
a[1]=i > map.get(nums[i])?i:map.get(nums[i]);
break;
}
}
return a;
}
}