leetcode刷題第一題
阿新 • • 發佈:2020-11-28
題目:
給定一個整數陣列 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 ifnums[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] 7if (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)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。