兩數之和:給定一個整數陣列,找出其中兩個數相加等於目標值
阿新 • • 發佈:2019-02-15
題目:給定一個整數數列,找出其中和為特定值的那兩個數。
你可以假設每個輸入都只會有一種答案,同樣的元素不能被重用。
有三種思路:
第一個思路:遍歷陣列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;
}
}