LeetCode第一題題解:兩數之和
阿新 • • 發佈:2020-09-02
LeetCode第一題:兩數之和
Ps:本系列文章只為記錄自己刷LeetCode過程中的解題過程和思路。
題目描述: 給定一個整數陣列 nums和一個目標值 target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。
你可以假設每種輸入只會對應一個答案。但是,陣列中同一個元素不能使用兩遍。
示例: 給定 nums = [2, 7, 11, 15], target = 9
因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解題過程和思路: 當我瀏覽了一便這個題目的時候,心裡想,哇,通俗易懂,這不是超簡單的嘛。emmm,題目意思是懂了,那麼怎麼用計算機解呢?首先映入我腦海中的是:emm,最基礎的解法吧——暴力,
$O(n^2)$
, emmm,實在不可取。接著,我又想呀想呀,怎麼降低時間複雜度呢? 排序怎麼樣?排序了之後從小到大遍歷陣列,算出每個數與後續數的和,由於排序過了,計算出來的求和結果將會是一個遞增的序列,當求和結果大於目標值 target 之後便停止計算,接著遍歷陣列中第二個數。咦,好像可行,可以避免一些無用的求和計算。由於用了排序,因此時間複雜度在$O(nlogn)$
與$O(n^2)$
之間。博主太笨了,之後再想了許久也沒想到更優的解法,因此參考了LeetCode上的大佬們的題解,哇,第一次感到世界如此奇妙。可以通過建立雜湊表,也就是字典的方式來加快查詢速度(空間換時間),具體怎麼做呢?解題收穫: 字典的妙用——以空間換時間的方式加快查詢效率,記好啦。
程式碼展示:
class Solution(object): def twoSum(self, nums, target): """ :type nums: List[int] :type target: int :rtype: List[int] """ nums_d = {} for index,num in enumerate(nums): # 遍歷nums陣列列舉兩個數中的第一個數 another_num = target-num # 目標-第一個數求第二個數 if another_num in nums_d: # 遍歷nums_d字典判斷兩個數中的第二個數是否存在 return min(index, nums_d[another_num]), max(index, nums_d[another_num]) # 若存在則返回 else: nums_d[num] = index # 以num為兩個數中的第一個數找不到答案,就將其放入存放第二個數的字典
結果展示: