算法進階—[LeetCode] 1. Two Sum 兩數之和

[LeetCode] 1. Two Sum 兩數之和


@lc app=leetcode.cn id=1java

[1] 兩數之和git

leetcode-cn.com/problems/tw…github

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

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

示例:app

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

由於 nums[0] + nums[1] = 2 + 7 = 9 因此返回 [0, 1]ui

這道題目給了咱們一個數組,還給了咱們一個目標值 target 讓咱們找到兩個數組,使其和爲 target,乍一看這道題可使用暴力搜索,這裏使用暴力搜索必然使用雙重 for 循環,那這個題目的解法的時間複雜度就是 O(n^2),爲了用空間換取時間,咱們只能想一個時間複雜度是 O(n) 的算法來實現,咱們既然已經決定使用線性時間複雜度來解決問題,就只能遍歷遍歷一個數字,可是另一個數字該怎麼辦呢?spa

咱們須要將其存儲起來,使用 HashMap 來創建數字和座標之間的映射,咱們知道 HashMap 是常數級別的查找效率,這樣在遍歷數組的時候,用 target 減去遍歷到的數字,好比 target 是 4,遍歷到了一個 2,那麼另一個 2 不能是以前那個 2,整個實現步驟爲:先遍歷一遍數組,創建 HashMap 映射,而後再遍歷一遍,開始查找,找到則記錄 index。代碼以下:code

雖然暴力破解法不是那樣的完美,可是在數據規模小的時候也算是一種能夠接受的方法

java 解法一:

class Solution {
  public int[] twoSum(int[] nums, int target) {
    // 循環遍歷數組 鎖定第一個值,而後在數組中找第二個值
    for(int i = 0;i < nums.length; i++ ){
      for(int j = i+1; j < nums.length; j++){
         // 由於目標值已知,只要將目標值減去第一個數字就能獲得另一個符合的數字
        if(nums[j] == target - nums[i] ){
          // 返回一個新的數組
          return new int[]{i, j};
        }
      }
    }
    // 找不到對應的數字 拋出異常
    throw new IllegalArgumentException("No two sum solution");
  }
}
複製代碼

JavaScript 解法一:

/** * @param {number[]} nums * @param {number} target * @return {number[]} */
let twoSum = function(nums, target) {
  for (let i = 0; i < nums.length; i++) {
    for (let j = i + 1; j < nums.length; j++) {
      if (nums[i] === target - nums[j]) {
        return [i,j];
      }
    }
  }
  throw new Error('No two sum solution');
};
複製代碼

java 解法二:

class Solution {
  public int[] twoSum(int[] nums, int target) {
    // 建立一個泛型Hashmap
    HashMap<Integer, Integer> m = new HashMap<Integer, Integer>();
    int[] res = new int[2];
    // 遍歷數組,將數組中的元素作一個 變成Hashmap的映射
    for (int i = 0; i < nums.length; i++) {
      m.put(nums[i], i);
    }

    for (int i = 0; i < nums.length; ++i) {
      int t = target - nums[i];
      // 若是在m 中找到t 而且這個元素的索引不是本身當前的索引
      if (m.containsKey(t) && m.get(t) != i) {
        res[0] = i;
        res[1] = m.get(t);
      }
    }
    return res;
  }
}
複製代碼

JavaScript 解法二:

/** * @param {number[]} nums * @param {number} target * @return {number[]} */
var twoSum = function(nums, target) {
  let map = new Map();
  let res = [];
  // 第一遍遍歷數組作map 映射
  for (let i = 0; i < nums.length; i++) {
    map.set(nums[i], i);
  }
  // 第二遍 進行查找
  for (let index = 0; index < nums.length; index++) {
    let t = target - nums[index];

    if (map.has(t) && map.get(t) != index) {
      res.push(index);
      res.push(map.get(t));
      break;
    }
  }
  return res;
};
複製代碼

詳情請點擊:原文連接

相關文章
相關標籤/搜索