leetcode官網
首先需要一點點關於時間和空間複雜度的概念。
首先先簡單地說一下時間複雜度:時間複雜度使用大o字母表示,不包括函式的首項和低階項,跟n
有關。比如說乙個程式的執行次數如下:
執行次數
時間複雜度o()
9999
o(1)
3n+9
o(n)
$$3n^2+2n+5$$
$$o(n^2)$$
其中常數項執行的時間複雜度都是o(1)【無論執行次數是多麼大】。
空間複雜度也就是這個演算法臨時需要的儲存單元。如果空間不隨n變化【也就是為乙個常數】,那麼他的空間複雜度就是o(1);
給定乙個整數陣列方法一很簡單,拿前面的數跟後面所有的數進行比較,**如下所示:nums
和乙個目標值target
,請你在該陣列中找出和為目標值的那兩個
整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,你不能重複利用這個陣列中同樣的元素【這個應該是翻譯有點問題,意思應該是target為兩個不同的數相加,不可能為一樣的數】。
示例:給定 nums = [2, 7, 11, 15], target = 9
因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
class
solution
; return re;}}
}return
null; }}
那麼在這題中,時間複雜度:第乙個for迴圈n次,第二個for迴圈n-1次
所以,時間和空間的複雜度很簡單的知道:
時間複雜度
空間複雜度
$$o(n^2)$$
o(1)
思考一下,如果我們可以這樣做:我們知道乙個數,用target去相減,得到乙個數後,再去判斷這個是否存在,如果存在則返回,這樣就可以減少時間複雜度到o(n)了,這時候神奇的hashmap就出現了。(ps:hashmap進行元素的查詢時間複雜度是o(1))【這個方法當然,emm不是我想到的/(ㄒoㄒ)/~~】
class
solution
for(int j=0;j// 獲得相減數
int com = target - nums[j];
// 假如存在,則比較是否重複
if(map.containskey(com) && map.get(com) != j);}}
return
null;}}
時間複雜度是o(n),空間複雜度是o(n),因為是用了hashmap去儲存元素。
時間複雜度
空間複雜度
$$o(n)$$
o(n)
本來以為這樣很牛逼了,但是現在發現還有更牛逼的操作
在上面的操作中,我們是使用hashmap儲存所有陣列,但是如果結果就在第乙個和第二個呢?那豈不是浪費空間?這時候我們就可以先比較,後放陣列。
class
solution
; }
map.put(nums[i],i);
}
return
null;}}
時間複雜度
空間複雜度
$$o(n)$$
o(n)
在leetcode提交後檢視了一下時間,後面兩種速度大約比第一種快了3倍。
以後我還是老老實實刷題吧。
謹守本心,做到極致 ——《將夜》
LeetCode 每天一題 python
請你來實現乙個 atoi 函式,使其能將字串轉換成整數。首先,該函式會根據需要丟棄無用的開頭空格字元,直到尋找到第乙個非空格的字元為止。接下來的轉化規則如下 如果第乙個非空字元為正或者負號時,則將該符號與之後面盡可能多的連續數字字元組合起來,形成乙個有符號整數。假如第乙個非空字元是數字,則直接將其與...
LeetCode 每天一題 python
判斷乙個整數是否是回文數。回文數是指正序 從左向右 和倒序 從右向左 讀都是一樣的整數。示例 1 輸入 121 輸出 true 示例 2 輸入 121 輸出 false 解釋 從左向右讀,為 121 從右向左讀,為 121 因此它不是乙個回文數。示例 3 輸入 10 輸出 false 解釋 從右向左...
LeetCode 每天一題 python
編寫乙個函式來查詢字串陣列中的最長公共字首。如果不存在公共字首,返回空字串 示例 1 輸入 flower flow flight 輸出 fl 示例 2 輸入 dog racecar car 輸出 解釋 輸入不存在公共字首。說明 所有輸入只包含小寫字母 a z class solution def l...