每天寫一道演算法題(6) 三數之和

2021-09-27 06:59:45 字數 765 閱讀 9017

給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。

注意:答案中不可以包含重複的三元組。

例如, 給定陣列 nums = [-1, 0, 1, 2, -1, -4],

滿足要求的三元組集合為:

[[-1, 0, 1],

[-1, -1, 2]

]這道題呢,第一眼看上去就想暴力,但是暴力又感覺不太對,畢竟n3的複雜度,後來想了想,思路還是差不多,但是有優化。

先排序,排序之後查詢,效率會更高

排序之後整個陣列會變得有序,然後先固定乙個數i,查詢兩外兩個和相加等於0的數。為了減少重複,每次只在i的右邊取比i大的數,這樣的話只有當i<0是才會有解。

在i右邊取最大的數r和最小的數l,相加,如果大於0,則r向左移動,如果小於0則l向右移動,r和l相等則搜尋結束。

class solution 

l = i+1;

r = len - 1;

while(l < r)

}i++;

}return list;

}}

這裡的話剛開始沒有注意到兩個細節:

1.固定的i的值每次不能相同,不然會造成重複

2.l和r移動後的值可能和移動之前的值相同,比如nums[l] = nums[l - 1],這樣的也會造成重複的解

思路就是這樣,但是呢,小細節很多leetcode很多這種小細節,還是挺考基本功的 

每天一道演算法題 醜數

題目描述 把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。分析 使用兩個佇列乙個存放節點,乙個存放值。先將根節點加入到佇列中,然後遍歷佇列中的元素,遍歷過程中,訪問該元素的左...

每天一道演算法題

no.1 棧是特殊的線性表,它。a.對 b.錯答案 錯,它的插入和刪除都是在同一端進行的。no.2 n個葉子節點的滿二叉樹 除了葉子節點,每個節點都有兩個孩子 總共有多少個節點?a.2n 1 b.2n c.n 1 d.n答案 a 滿二叉樹我們講過了,度為0的節點比度為2的加點多乙個。滿二叉樹是特殊的...

每天一道演算法題

1.給定乙個只包括 的字串,判斷字串是否匹配。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。思路 正確思路 不需要考慮輸入內容是否合法,這只是做題,不是工程 定義乙個字典,後括號為鍵,前半部分為值 定義乙個元素儲存棧頂,注意這個設定,取棧...