LeetCode 第 1個問題:兩數之和
題目描述
給定一個整數數組 nums
和一個目標值 target
,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。python
你能夠假設每種輸入只會對應一個答案。可是,你不能重複利用這個數組中一樣的元素。算法
示例:數組
給定 nums = [2, 7, 11, 15], target = 9 由於 nums[0] + nums[1] = 2 + 7 = 9 因此返回 [0, 1]
暴力搜索算法
解題思路:利用兩個循環解決函數
代碼spa
class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: for i in range (len(nums)): for j in range(i+1, len(nums)): if nums[i] + nums[j] == target: return [i,j]
結果and總結code
運行時間:6132ms 內存消耗:14MB索引
此處用到了兩個循環內存
利用python中list相關函數解決
方法一:
解題思路:
找到num2 == target - num1 是否在list中,而後運用兩個方法:
get
- num2 in nums 返回true說明成功
- nums.index(num2) 查找num2的索引
代碼io
class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: for i in range(len(nums): num1 = nums[i] num2 = target - num1 if num2 in nums: #若是num2=num1,且在nums中出現了一次,說明找到num1自己。 if(num1 == num2) & (nums.count(num2)==1): continue return[i,nums.index(num2,i+1)] #index(num2,i+1)是從num1後的序列找num2位置
結果and總結
運行時間:1148ms 內存消耗:14MB
此處用到了一個循環
方法二:
解題思路:在方法一的基礎上,num2的查找不須要每次從nums查找一遍,能夠按照切片的思想從num1以前或者以後查找就行。此次從num1以前找.
代碼
class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: for i in range(1,len(nums)): temp = nums[:i] num1 = target - nums[i] if num1 in temp: j = temp.index(num1) return[j,i]
結果and總結
運行時間:408ms 內存消耗:13.8MB
這個算法先找到列表[2,7,11,15]中的7,再找到2;因此return[j,i]
時先返回j,再返回i
利用字典解決
方法一:
解題思路:利用字典模擬哈希求解,遍歷列表同時查字典
class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: dct = { } for i, n in enumerate(nums): if target-n in dct: return [dct[target - n], i] dct[n] = i #構造字典
結果and總結
運行時間:48ms 內存消耗:14.6MB
- 這個算法先用列表中的[2,7,11,15],9-2=7在字典中查找7,但此時字典是空的,把2存入字典;
- 而後再用9-7=2在字典中查找,此時字典中已存入了一個2,找到了7和2的位置;
- 在返回時
return[dct[target - n],i]
,此時target - n
爲9-7=2,故先返回2的位置,再返回7的位置
小結
利用字典解決該問題最簡單,遍歷列表同時查字典,但也消耗了必定內存