leetcode兩數求和從初步到優化
- 2020 年 2 月 13 日
- 筆記
前言
◆ ◆ ◆ ◆
上周有小夥伴去面試,小明問了一下面試的情況,順便問問題目。他說有一道題是根據輸入數組以及結果,返回兩數的數組下標。這個聽著就很熟悉,因為leetcode的第一題,於是就重新回顧了一下。
題目
◆ ◆ ◆ ◆

順便找了個中文版:

方法一
◆ ◆ ◆ ◆
初步第一眼看著並不難,因為是兩個for循環遍歷一下,就可以找出結果,方法比較粗暴

時間複雜度:兩層 for 循環,O(n²)
空間複雜度:O(1)
方法二
◆ ◆ ◆ ◆
上面的方法比較粗暴,優化空間還是有的。最大的問題就是兩重for循環,首先解決的是能不能一個for循環就能搞定。
我們看一下核心程式碼:

換一個理解:
for(int j=(i+1);j<nums.length;j++){ sub=target-nums[i] if(nums[j]==sub){ }
第二層 for 循環的作用是是遍歷所有的元素,看哪個元素等於sub,時間複雜度為 O(n)。
有沒有一種方法,不用遍歷就可以找到元素里有沒有等於 sub 的?
我們最愛的hashMap!
我們可以把數組的每個元素的值保存為map 的 key,下標保存為 value 。
這樣只需判斷sub是否存在於map就行,而此時的時間複雜度僅為 O(1)。
於是就有了第二種方法:

時間複雜度:O(n)
空間複雜度:所謂的空間換時間,hashMap 的空間複雜度變為 O(n)
方法三
◆ ◆ ◆ ◆
方法二中的的第一個for僅僅起到賦值作用,而這個賦值好像是可以加到下面的for當中的。於是就有了方法三:

當然這個也有個小問題,因為如果第一個數是結果中的某一個的話,第一次的map中是找不到它的,所以這個有個小問題,歡迎大神加微信交流~miraclesComing
總結
◆ ◆ ◆ ◆
程式優化裡面,空間換時間,時間換空間,都是一個比較常用的方法,犧牲小部分來換取高性能,其實還是可取的。