LeetCode每天一題之兩數之和

2022-01-10 22:08:39 字數 1933 閱讀 4838

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...