1. 程式人生 > 實用技巧 >leetcode刷題第一題

leetcode刷題第一題

題目:
給定一個整數陣列 nums和一個目標值 target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。
你可以假設每種輸入只會對應一個答案。但是,陣列中同一個元素不能使用兩遍。
開始思路:
只是做出來,但是沒有考慮只對應一個答案,兩個for迴圈不容易解決重複問題,
 1 a = [2,4,6,3]
 2 b = 9
 3 def twoSum(nums, target):
 4     lens = len(nums)
 5     for i in range(lens):
 6         for j in range(i+1,lens):
 7             if
nums[i]+nums[j] == target: 8 print(i, j) 9 break 10 break

這樣在列表的第一個第二個值重複時候會出錯

改正思路:只迴圈一個j,和值減去當前迴圈值去尋找差值,得到唯一性:

 1 a = [2,4,6,3]
 2 b = 9
 3 def twoSum(nums, target):
 4     lens = len(nums)
 5     for i in range(1, len(nums)):
 6         temp = nums[:i]
 7
if (target - nums[i]) in temp: 8 j = temp.index(target - nums[i]) 9 print(j, i) 10 11 12 twoSum(a, b)

需要學習注意的是:

range 的範圍是從0到i-1

列表的下標範圍是從0開始對應元素

a[:1]表示a[0],列表的第一個元素

進一步學習:

enumerate() 函式用於將一個可遍歷的資料物件(如列表、元組或字串)組合為一個索引序列,同時列出資料和資料下標,一般用在 for 迴圈當中
enumerate(sequence, [start=0])
  • sequence -- 一個序列、迭代器或其他支援迭代物件。
  • start -- 下標起始位置。
 1 def two_sum(nums, target):
 2     """這樣寫更直觀,遍歷列表同時查字典"""
 3     dct = {}
 4     for i, n in enumerate(nums):
 5         #nums自動識別為字典,nums中下標為鍵,值為列表對應值
 6         cp = target - n
 7         #尋找和減去第一個的數的差值
 8         if cp in dct:
 9             print([dct[cp], i])
10         else:
11             dct[n] = i
12             #返回的一種寫法
13 
14 
15 two_sum(a, b)

引申演算法:雜湊演算法

 1 用字典模擬雜湊求解
 2 字典記錄num1和num2的值和位置
 3 enumerate() 函式用於將一個可遍歷的資料物件(如列表、元組或字串)組合為一個索引序列,同時列出資料和資料下標,一般用在 for 迴圈當中。
 4 def twoSum(nums, target):
 5     hashmap={}
 6     #儲存的內容是鍵值對(key-value)對映
 7     for ind,num in enumerate(nums):
 8         hashmap[num] = ind
 9     for i,num in enumerate(nums):
10         j = hashmap.get(target - num)
11         if j is not None and i!=j:
12             return [i,j]
最後兩個引用出處
作者:lao-la-rou-yue-jiao-yue-xiang
連結:https://leetcode-cn.com/problems/two-sum/solution/xiao-bai-pythonji-chong-jie-fa-by-lao-la-rou-yue-j/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。