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