Leetcode解題筆記-15. 3Sum

題目描述

原題鏈接:3Sum

Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note: The solution set must not contain duplicate triplets.
For example, given array S = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]

解題思路

跟2Sum一樣,先排一遍序,時(shí)間復(fù)雜度就至少是O(n lgn )了。
現(xiàn)在我要使 a+b+c = 0 ,我可以遍歷一遍排序后的數(shù)組,對(duì)每一個(gè)nums[i],假設(shè)這里 a < b < c ,且 a = nums[i] ,也就是說(shuō)要找出 b + c = 0 - a 。

那么b和c在哪里?因?yàn)閿?shù)組是遞增的,所以b和c肯定在nums[i] (也就是a)的右邊。(因?yàn)橐呀?jīng)假設(shè) a 最小)那么對(duì)于數(shù)組中nums[i]右邊的部分,可以采用雙指針的思想,一個(gè)指針在最左邊,一個(gè)指針在最右邊,看看 b + c 是否等于 0 - a ,如果大了,那么右指針左移,如果小了,那么左指針右移,如果相等,則得到一個(gè)解。

還有一個(gè)重要的問(wèn)題就是解的去重,因?yàn)槲覀円?guī)定了 a < b < c,所以只要保證所有解中 a和b不都相同就可以了。舉個(gè)例子:

假如解集中已經(jīng)有 { [ -3, 1, 2 ] , [ -4, 2, 2] }
代碼還在跑,當(dāng)遇到 a = -3 且 b = 1的情況就自動(dòng)略過(guò)。因?yàn)閿?shù)組是遞增的,我只要檢查跟前一個(gè)元素是否相等即可。

代碼

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        vector<vector<int> > result;
        
        if (nums.size() < 3)
            return result;
        for (int i = 0; i < nums.size() - 2; i ++){
            int a = nums[i];
            if (i > 0 && a == nums[i-1])
                continue;
            int bcSum = 0 - a;
            int bIndex = i + 1;
            int cIndex = nums.size() - 1;
            while (bIndex < cIndex){
                if (bIndex > i + 1 && nums[bIndex] == nums[bIndex - 1]) {
                    bIndex ++;
                    continue;
                }
                int b = nums[bIndex];
                int c = nums[cIndex];
                if (b + c > bcSum){
                    cIndex --;
                    continue;
                } else if (b + c < bcSum){
                    bIndex ++;
                    continue;
                } else {
                    result.push_back({a, b, c});
                    cIndex --;
                    bIndex ++;
                }
            }
        }
        
        return result;
    }
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問(wèn)題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,921評(píng)論 0 33
  • 指針是C語(yǔ)言中廣泛使用的一種數(shù)據(jù)類型。 運(yùn)用指針編程是C語(yǔ)言最主要的風(fēng)格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu); ...
    朱森閱讀 3,614評(píng)論 3 44
  • 【1】7,9,-1,5,( ) A、4;B、2;C、-1;D、-3 分析:選D,7+9=16;9+(-1)=8;(...
    Alex_bingo閱讀 19,808評(píng)論 1 19
  • LeetCode 刷題隨手記 - 第一部分 前 256 題(非會(huì)員),僅算法題,的吐槽 https://leetc...
    蕾娜漢默閱讀 18,392評(píng)論 2 36
  • 最近張一山火了,他主演的警匪懸疑網(wǎng)劇余罪,剛開(kāi)播點(diǎn)擊量就破了億。本著強(qiáng)烈的好奇心,我點(diǎn)開(kāi)了這部劇,想看看當(dāng)年那個(gè)機(jī)...
    情語(yǔ)不傷閱讀 4,421評(píng)論 31 77

友情鏈接更多精彩內(nèi)容