LeetCode 1:兩數之和 Two Sum

題目:

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

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

Given an array of integers, return indices of the two numbers such that they add up to a specific target.數組

You may assume that each input would have exactly one solution, and you may not use the same element twice.函數

示例:ui

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

由於 nums[0] + nums[1] = 2 + 7 = 9
因此返回 [0, 1]
複製代碼

解題思路:

  • 暴力窮舉:外循環遍歷每一個元素 x,內循環查找是否存在一個值與 target - x 相等的目標元素,返回相等的目標元素和 x 的索引。時間複雜度 O (n^2),效率過低,pass。spa

  • 哈希表:哈希映射(map、dict),key 保存該元素,value 保存該元素索引。code

    • 兩次遍歷法:第一次遍歷把全部元素及其索引保存到哈希映射,第二次遍歷查找 target - x 相等的目標元素cdn

    • 一次遍歷法:假如 y = target - x,則 x = target -y,因此一次遍歷 在存入哈希映射的同時查找是否存在一個值與 target - x 相等的目標元素。對象

      例:nums = [2, 11, 7, 15], target = 9, hashmap = { }
      遍歷:
      i = 0: target - x = 9 - 2 = 7, 7 不存在於 hashmap 中,則 x(2) 加入 hashmap, hashmap = {2 : 0}
      i = 1: target - x = 9 - 11 = -2, -2 不存在於 hashmap 中,則 x(-2) 加入 hashmap, hashmap = {2 : 0, 11 : 1}
      i = 2: target - x = 9 - 7 = 2, 2 存在於 hashmap 中,則返回列表 [2, 0]
      複製代碼

代碼:

兩次遍歷(Java):索引

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {//一次遍歷轉換成鍵值對,key爲元素值,value爲索引值
            map.put(nums[i], i);
        }
        for (int i = 0; i < nums.length; i++) {//二次遍歷查找符合條件的元素
            int res = target - nums[i];
            if (map.containsKey(res) && map.get(res) != i) {//查找到的目標元素不能爲其自己
                return new int[]{i, map.get(res)};
            }
        }
        return null;
    }
}
複製代碼

一次遍歷 (Java):

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            int res = target - nums[i];
            if (map.containsKey(res)) {//由於自身元素還未加入到 hashmap,無需 map.get(res) != i 條件判斷
                return new int[]{i, map.get(res)};
            }
            map.put(nums[i], i);//未找到目標元素則將其加入 hashmap
        }
        return null;
    }
}
複製代碼

一次遍歷 (Python):

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        dic = {}
        for i, num in enumerate(nums): #枚舉 nums 數組
            if num in dic:
                return [dic[num], i]
            else:
                dic[target-num] = i
複製代碼

利用 Python 數組自帶 index 方法解題:

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        for i, num in enumerate(nums):
            if target-num in nums and nums.index(target-num) != i:
                return [i, nums.index(target-num)]
複製代碼

list.index():

描述:

index () 函數用於從列表中找出某個值第一個匹配項的索引位置。

語法:

index () 方法語法:

list.index(x, start, end)
複製代碼

參數:

  • x-- 查找的對象。
  • start-- 可選,查找的起始位置。
  • end-- 可選,查找的結束位置。

返回:

該方法返回查找對象的索引位置,若是沒有找到對象則拋出異常。

歡迎關注微.信.公.衆號: 愛寫Bug

愛寫Bug.png
相關文章
相關標籤/搜索