生活随笔
收集整理的這篇文章主要介紹了
三数之和(Leetcode第15题)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> result;//定義result為容器里的容器,相當于當容器里還有一個小容器,跟題目最后輸出的是符合數組相吻合。sort(nums.begin(), nums.end());//sort類,用于排序,從nums數組的第一個元素到最后一個元素// 找出a + b + c = 0// a = nums[i], b = nums[left], c = nums[right]for (int i = 0; i < nums.size(); i++) {// 排序之后如果第一個元素已經大于零,那么無論如何組合都不可能湊成三元組,直接返回結果就可以了if (nums[i] > 0) {return result;}// 錯誤去重方法,將會漏掉-1,-1,2 這種情況/*if (nums[i] == nums[i + 1]) {continue;}*/// 正確去重方法if (i > 0 && nums[i] == nums[i - 1]) {continue;}int left = i + 1;int right = nums.size() - 1;while (right > left) {// 去重復邏輯如果放在這里,0,0,0 的情況,可能直接導致 right<=left 了,從而漏掉了 0,0,0 這種三元組/*while (right > left && nums[right] == nums[right - 1]) right--;while (right > left && nums[left] == nums[left + 1]) left++;*/if (nums[i] + nums[left] + nums[right] > 0) {right--;} else if (nums[i] + nums[left] + nums[right] < 0) {left++;} else {result.push_back(vector<int>{nums[i], nums[left], nums[right]});// 去重邏輯應該放在找到一個三元組之后while (right > left && nums[right] == nums[right - 1]) right--;while (right > left && nums[left] == nums[left + 1]) left++;//去重的原理:因為是已經排過序了,重復的序列必然是緊挨著的,我們只需在找到的結果中把指針回退一位即可。(自己動手花花邏輯就能理解了)// 找到答案時,雙指針同時收縮right--;left++;}}}return result;}
};
整體的解題思路:
第一步是定義result,定義的是容器里的容器,用于返回的是數組對
第二步是排序,用的是sort方法,從小到大的順序
第三步就是指針的移動方式,拿這個nums數組來舉例,首先將數組排序,然后有一層for循環,i從下表0的地方開始,同時定一個下表left?定義在i+1的位置上,定義下表right?在數組結尾的位置上。
依然還是在數組中找到?abc?使得a?+?b?+c?=0,我們這里相當于??a?=?nums[i]?b?=?nums[left]??c?=?nums[right]。
接下來如何移動left?和right呢,?如果nums[i]?+?nums[left]?+?nums[right]?>?0??就說明?此時三數之和大了,因為數組是排序后了,所以right下表就應該向左移動,這樣才能讓三數之和小一些。
如果?nums[i]?+?nums[left]?+?nums[right]?<?0?說明?此時?三數之和小了,left?就向右移動,才能讓三數之和大一些,直到left與right相遇為止。
最重要的是去重:去重一共分為兩部分,找結果的前提是排序了數組,第一部分是在找到符合條件的值之后,就把其地址存儲在容器里,這時候再移動I指針,如果下一個是與原來的值是相等的,那么這就是一種重復的情況。
第二部分是當找到符合條件的值以后,再移動left活著right的時候,旁邊的值是一致的,那么就是重復的情況,這時候就要倒回去繼續判斷了。
題目所涉及的知識點內容可參考以下博主:
一個是容器(vector),具體的一些內容可參考下面博主:https://blog.csdn.net/wkq0825/article/details/82255984
第二個知識點是sort函數,具體內容參考下面博主:https://blog.csdn.net/Architect_chaser/article/details/88322605
總結
以上是生活随笔為你收集整理的三数之和(Leetcode第15题)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。