每日一題,防止痴呆 = =給你乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?請你找出所有滿足條件且不重複的三元組。
先分享乙個自己的最後沒得出結果的思路吧… 可能這段時間一會做題一會不做題,腦子有點慢 = =。我一開始的想法是因為是三個數相加得0,那麼其實確定兩個數就是可以的,那麼我們直接遍歷兩個數,然後第三個數利用雜湊檢查是否在數列裡就可以了,這樣也就是o(n^2)的複雜度。
但是題目要求結果中不能包含重複的三元組,這塊卡了我好長時間,順著這個思路,只能考慮怎麼用雜湊來檢查重複三元組了,因為為了保證演算法o(n^2)的複雜度,只能讓這部分的檢查複雜度為o(1),想了一下, 其實檢查重複三元組只需要檢查其中兩個數是否相同就行了,這樣我考慮把兩個數構造成字串,再繼續用雜湊來檢查,然而結果超時了 = =,可能涉及到字串就比較慢了,我也沒有考慮出別的編碼方法,可以用來檢查兩個三元組中是否有兩個數相等。
思路:下面就說一下正確的思路。涉及到重複的情況,我們可以考慮排序,因為排完序後,重複的元素就都到一起了,那樣我們就可以通過檢視前後元素來去除重複了。我們首先對陣列進行排序,然後列舉第乙個元素,如果遇到當前元素和前乙個元素重複,那麼就跳過。
然後我們用雙指標,令第三個元素的指標指向最後乙個元素,然後我們列舉第二個元素,當三者相加大於0時,就令第三個元素的指標向左移動,直到和小於等於0,進行判斷,如果等於0,那麼把當前的三元組加入結果。可以雙指標做的原因是,因為陣列是排好序的,那麼如果a + b + c > 0,那麼隨著a不變,b向後移動,a + b + c肯定不會等於0,所以當前的c是不可能的,就可以直接向左移動。上述的a, b, c指的是第
一、第二、第三個元素。
ac**
#define max_int 2147483647
class
solution
if(k <= j)
break;if
(nums[i]
+ nums[j]
+ nums[k]==0
)}}}
return res;}}
;
leetcode每日一題 15 三數之和
題目描述 題解和思路 優質 閒話給你乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 請你找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1...
每日一題 LeetCode
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...
LeetCode每日一題(三) 移除元素
題目描述 給定乙個陣列 nums 和乙個值 val,你需要原地移除所有數值等於 val 的元素,返回移除後陣列的新長度。不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 o 1 額外空間的條件下完成。元素的順序可以改變。你不需要考慮陣列中超出新長度後面的元素。示例 1 給定 nums 3,2...