Leetcode 1 兩數之和

問題描述

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

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

實例:

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

因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

解決方法

解法一

暴力遍歷方法,通過雙層遍歷,窮盡組合找到兩個元素,使之和滿足目標值。

原理:雙層遍歷所有元素,找到 a + b = target 的元素的索引。

時間復雜度為 O(n^2),空間復雜度為 O(1)。

var twoSum = function(nums, target) {

  for (let i = 0; i < nums.length; i++) {
    const a = nums[i];
    
    for (let j = i + 1; i < nums.length; i++) {
      const b = nums[i];
      if (a + b === target) {
        return [i, j];
      }
    }
  }

  return new Error('there is no answer');
};

解法二

為了快速的查找 target - nums[i] 元素所在的位置,我們可以使用哈希表快速查找元素。比起遍歷算法,執行的時間效率為 O(1)。具體實現如下:

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function(nums, target) {
  const map = new Map();

  nums.forEach((value, index) => {
    map.set(value, index);
  });

  for (let i = 0; i < nums.length; i++) {
    const a = nums[i];
    const residual_value = target - a;
    const j = map.get(residual_value);
    if (j !== undefined && j !== i) {
      return [i, j];
    }
  }

  return new Error('there is no answer');
};

時間復雜度為 O(n),空間復雜度為 O(n)。

解法三

仍然是使用哈希表找元素,但是只使用一次哈希。

var twoSum = function(nums, target) {

  const map = new Map();

  for (let i = 0; i < nums.length; i++) {
    const complement = target - nums[i];

    if (map.get(complement)) {
      return [map.get(complement), i];
    }
    
    map.set(nums[i], i);
  }

  return new Error('there is no answer');
};

參考文檔

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 題目: 題目地址:https://leetcode-cn.com/problems/two-sum/ 問題描述: ...
    MrGeekr極氪閱讀 634評論 0 0
  • 兩數之和 LeetCode 題目描述 給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和...
    天空像天空一樣藍閱讀 262評論 0 2
  • 題目描述 給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和為目標值的那 兩個 整數,并...
    Chase_Eleven閱讀 334評論 2 0
  • LeetCode:1兩數之和 標簽:數組、哈希表 給定一個整數數組 nums 和一個目標值 target,請你在該...
    burger8閱讀 116評論 0 0
  • 山河是 城市的母親 人是城市 弒母的兇器 沒有罪咎 沒有恩情 別太高看自己 兇器保持中立
    一枝小草閱讀 129評論 0 0