關於力扣第一題 ---兩數之和(多方法)

題目描述:算法

給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。數組

你能夠假設每種輸入只會對應一個答案。可是,你不能重複利用這個數組中一樣的元素。優化

示例:spa

給定 nums = [2, 7, 11, 15], target = 9

由於 nums[0] + nums[1] = 2 + 7 = 9
因此返回 [0, 1]
1.窮舉法,兩次遍歷,暴力計算。使用第1個數與後面的每一個數之和判斷是否等於目標值、再用第2個數字作一樣的操做,直到徹底相等,返回索引值+1:
兩個循環,時間複雜度爲O(N*N)
 1 var twoSum = function(nums, target) {
 2     for(var i = 0; i < nums.length - 1; i++){
 3         for(var j = i + 1; j < nums.length; j++) {
 4         if (nums[i] + nums[j] == target) {
 5             var arr = [];
 6             arr.push(i,j);
 7             return arr;
 8         }
 9       }
10    }
11 };
 

2.利用indexOf, Array 的 indexOf 方法其實是對數組再遍歷一次,寫法上有優化,可是實際時間複雜度仍是O(N*N):code

 1 let twoSum = function(nums, target) {
 2     let a, b;
 3     for(let i = 0; i < nums.length; i++) {
 4         b = nums.indexOf(target - nums[i]);
 5         if(b > -1 && b !== i) {
 6             a = i;
 7             break;
 8         }
 9     }
10     return [a, b];
11 };

 

3.使用對象索引(時間複雜度低):對象

建立一個對象,並給它賦值,對象的鍵值是咱們想要檢索的值,對象的值是在數組中的索引。blog

解題思路:構造了arr{ key:value} 對象。將target-nums[i] 差值放在arr{ }對象中,並存儲其位置i。而後每次就在arr{ }對象中找有沒有對應的數便可。排序

1 var twoSum = function(nums, target) {
2     var arr = {};
3     for (var i = 0; i < nums.length; i++) {
4         if (typeof(arr[nums[i]]) !== "undefined"){
5             return [arr[nums[i]], i];                        
6         }                         
7         arr[target - nums[i]] = i;
8     }
9 };

 

4.經典解題方法,排序+二分搜索索引

若是這個數據是有序的,那麼咱們很容易聯想到使用二分搜索法,能夠每次判斷target-num[i]對應的值是否在num[i+1:]中,這個時候算法的複雜度變成了O(nlogn)get

 1 var twoSum = function getSum(arr,sum) {
 2     if(arr == '' || arr.length == 0){
 3         return false;
 4     }
 5     // arr.sort((a,b) => { return a-b });  若是是無序數組可先轉爲有序數組再使用二分搜索法
 6     var left = 0, right = arr.length -1;
 7     while(left < right){
 8         if(arr[left] + arr[right] > sum){
 9             right--;
10         }
11         else if(arr[left] + arr[right] < sum){
12             left++;
13         }
14         else{
15             return [left,right]; 
16             left++;
17             right--;
18         }
19     }
20 }

 

5.Hash方法,在所給數組中查找依次查找與當前值所對應的目標值是否存在,若是存在則記錄當前index值。

 1 const twoSum = function(nums, target) {
 2    // 用於記錄數組nums的長度
 3     const length = nums.length;
 4     // 實例化一個Map對象
 5     let hash = new Map();
 6     let index = 0;
 7     for (index = 0; index < length; index++) {
 8         // 設置 hashMap 的 <key, value>,用於後面比較取值
 9         hash.set(nums[index], index);
10     }
11  
12  
13     // 遍歷數組中的每個數,求出另外一個與其相加能夠知足條件的數的值,存儲在 @param numToFind 中
14     let numToFind;
15     for( index = 0; index < length; index++) {
16          numToFind = target - nums[index];
17          // 查詢 hashMap 中對應的值是否有對應的index,並且不能是當前數的下標(防止出現 3 + 3 = 6,但數組nums中只有一個3這樣的狀況)
18          if (hash.has(numToFind) && index !== hash.get(numToFind)) {
19               return [index, hash.get(numToFind)];
20          }
21      }
22 };
相關文章
相關標籤/搜索