1. 程式人生 > >兩數之和:給定一個整數陣列,找出其中兩個數相加等於目標值

兩數之和:給定一個整數陣列,找出其中兩個數相加等於目標值

題目:給定一個整數數列,找出其中和為特定值的那兩個數。
你可以假設每個輸入都只會有一種答案,同樣的元素不能被重用。

有三種思路:
第一個思路:遍歷陣列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; } }