最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)現(xiàn)LeetCode(15.三數(shù)之和)

 更新時(shí)間:2021年07月13日 09:12:01   作者:Grandyang  
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(三數(shù)之和),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

[LeetCode] 15. 3Sum 三數(shù)之和

Given an array S of n integers, are there elements abc in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note:

  • Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
  • 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)

這道題讓我們求三數(shù)之和,比之前那道 Two Sum 要復(fù)雜一些,博主考慮過先 fix 一個(gè)數(shù),然后另外兩個(gè)數(shù)使用 Two Sum 那種 HashMap 的解法,但是會(huì)有重復(fù)結(jié)果出現(xiàn),就算使用 TreeSet 來去除重復(fù)也不行,會(huì) TLE,看來此題并不是考 Two Sum 的解法。來分析一下這道題的特點(diǎn),要找出三個(gè)數(shù)且和為0,那么除了三個(gè)數(shù)全是0的情況之外,肯定會(huì)有負(fù)數(shù)和正數(shù),還是要先 fix 一個(gè)數(shù),然后去找另外兩個(gè)數(shù),只要找到兩個(gè)數(shù)且和為第一個(gè) fix 數(shù)的相反數(shù)就行了,既然另外兩個(gè)數(shù)不能使用 Two Sum 的那種解法來找,如何能更有效的定位呢?我們肯定不希望遍歷所有兩個(gè)數(shù)的組合吧,所以如果數(shù)組是有序的,那么就可以用雙指針以線性時(shí)間復(fù)雜度來遍歷所有滿足題意的兩個(gè)數(shù)組合。

對(duì)原數(shù)組進(jìn)行排序,然后開始遍歷排序后的數(shù)組,這里注意不是遍歷到最后一個(gè)停止,而是到倒數(shù)第三個(gè)就可以了。這里可以先做個(gè)剪枝優(yōu)化,就是當(dāng)遍歷到正數(shù)的時(shí)候就 break,為啥呢,因?yàn)閿?shù)組現(xiàn)在是有序的了,如果第一個(gè)要 fix 的數(shù)就是正數(shù)了,則后面的數(shù)字就都是正數(shù),就永遠(yuǎn)不會(huì)出現(xiàn)和為0的情況了。然后還要加上重復(fù)就跳過的處理,處理方法是從第二個(gè)數(shù)開始,如果和前面的數(shù)字相等,就跳過,因?yàn)椴幌氚严嗤臄?shù)字fix兩次。對(duì)于遍歷到的數(shù),用0減去這個(gè) fix 的數(shù)得到一個(gè) target,然后只需要再之后找到兩個(gè)數(shù)之和等于 target 即可。用兩個(gè)指針分別指向 fix 數(shù)字之后開始的數(shù)組首尾兩個(gè)數(shù),如果兩個(gè)數(shù)和正好為 target,則將這兩個(gè)數(shù)和 fix 的數(shù)一起存入結(jié)果中。然后就是跳過重復(fù)數(shù)字的步驟了,兩個(gè)指針都需要檢測重復(fù)數(shù)字。如果兩數(shù)之和小于 target,則將左邊那個(gè)指針i右移一位,使得指向的數(shù)字增大一些。同理,如果兩數(shù)之和大于 target,則將右邊那個(gè)指針j左移一位,使得指向的數(shù)字減小一些,代碼如下:

解法一:

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> res;
        sort(nums.begin(), nums.end());
        if (nums.empty() || nums.back() < 0 || nums.front() > 0) return {};
        for (int k = 0; k < (int)nums.size() - 2; ++k) {
            if (nums[k] > 0) break;
            if (k > 0 && nums[k] == nums[k - 1]) continue;
            int target = 0 - nums[k], i = k + 1, j = (int)nums.size() - 1;
            while (i < j) {
                if (nums[i] + nums[j] == target) {
                    res.push_back({nums[k], nums[i], nums[j]});
                    while (i < j && nums[i] == nums[i + 1]) ++i;
                    while (i < j && nums[j] == nums[j - 1]) --j;
                    ++i; --j;
                } else if (nums[i] + nums[j] < target) ++i;
                else --j;
            }
        }
        return res;
    }
};

或者我們也可以利用 TreeSet 的不能包含重復(fù)項(xiàng)的特點(diǎn)來防止重復(fù)項(xiàng)的產(chǎn)生,那么就不需要檢測數(shù)字是否被 fix 過兩次,不過個(gè)人覺得還是前面那種解法更好一些,參見代碼如下:

解法二:

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        set<vector<int>> res;
        sort(nums.begin(), nums.end());
        if (nums.empty() || nums.back() < 0 || nums.front() > 0) return {};
        for (int k = 0; k < (int)nums.size() - 2; ++k) {
            if (nums[k] > 0) break;
            int target = 0 - nums[k], i = k + 1, j = (int)nums.size() - 1;
            while (i < j) {
                if (nums[i] + nums[j] == target) {
                    res.insert({nums[k], nums[i], nums[j]});
                    while (i < j && nums[i] == nums[i + 1]) ++i;
                    while (i < j && nums[j] == nums[j - 1]) --j;
                    ++i; --j;
                } else if (nums[i] + nums[j] < target) ++i;
                else --j;
            }
        }
        return vector<vector<int>>(res.begin(), res.end());
    }
};

到此這篇關(guān)于python實(shí)現(xiàn)LeetCode(三數(shù)之和)的文章就介紹到這了,更多相關(guān)python實(shí)現(xiàn)三數(shù)之和內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言實(shí)現(xiàn)猜數(shù)字小游戲

    C語言實(shí)現(xiàn)猜數(shù)字小游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)猜數(shù)字小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • QT?UDP網(wǎng)絡(luò)編程實(shí)現(xiàn)簡單消息傳輸

    QT?UDP網(wǎng)絡(luò)編程實(shí)現(xiàn)簡單消息傳輸

    這篇文章主要為大家詳細(xì)介紹了QT?UDP網(wǎng)絡(luò)編程實(shí)現(xiàn)簡單消息傳輸,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 一文帶你學(xué)習(xí)C/C++中的<Windows.h>庫

    一文帶你學(xué)習(xí)C/C++中的<Windows.h>庫

    c語言 #include<windows.h>是寫window程序需要的重要頭文件,下面這篇文章主要給大家介紹了C/C++中<Windows.h>庫的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • C語言實(shí)現(xiàn)字符串匹配KMP算法

    C語言實(shí)現(xiàn)字符串匹配KMP算法

    相信很多人(包括自己)初識(shí)KMP算法的時(shí)候始終是丈二和尚摸不著頭腦,要么完全不知所云,要么看不懂書上的解釋,要么自己覺得好像心里了解KMP算法的意思,卻說不出個(gè)究竟,所謂知其然不知其所以然是也。
    2014-08-08
  • Qt音視頻開發(fā)之實(shí)現(xiàn)ffmpeg視頻旋轉(zhuǎn)顯示

    Qt音視頻開發(fā)之實(shí)現(xiàn)ffmpeg視頻旋轉(zhuǎn)顯示

    這篇文章主要為大家詳細(xì)介紹了在Qt音視頻開發(fā)中如何利用ffmpeg實(shí)現(xiàn)視頻旋轉(zhuǎn)顯示,文中的實(shí)現(xiàn)步驟講講清晰,感興趣的小伙伴可以了解一下
    2023-03-03
  • C語言選擇排序算法及實(shí)例代碼

    C語言選擇排序算法及實(shí)例代碼

    本篇文章主要介紹了 C語言選擇排序算法,這里提供代碼實(shí)例以便大家理解,通過本文,更好的理解排序算法
    2016-07-07
  • C++內(nèi)存對(duì)齊的實(shí)現(xiàn)

    C++內(nèi)存對(duì)齊的實(shí)現(xiàn)

    本文主要介紹了C++內(nèi)存對(duì)齊的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 詳談c++跨平臺(tái)編碼的問題

    詳談c++跨平臺(tái)編碼的問題

    下面小編就為大家?guī)硪黄斦刢++跨平臺(tái)編碼的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • C語言 動(dòng)態(tài)內(nèi)存開辟常見問題解決與分析流程

    C語言 動(dòng)態(tài)內(nèi)存開辟常見問題解決與分析流程

    動(dòng)態(tài)內(nèi)存是相對(duì)靜態(tài)內(nèi)存而言的。所謂動(dòng)態(tài)和靜態(tài)就是指內(nèi)存的分配方式。動(dòng)態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存
    2022-03-03
  • 使用kendynet構(gòu)建異步redis訪問服務(wù)

    使用kendynet構(gòu)建異步redis訪問服務(wù)

    這篇文章主要介紹了在kendynet上寫的一個(gè)簡單的redis異步訪問接口,大家參考使用吧
    2014-01-01

最新評(píng)論

宁波市| 武威市| 龙海市| SHOW| 汪清县| 黄骅市| 曲沃县| 天祝| 达拉特旗| 汾西县| 泽普县| 广元市| 咸丰县| 仁布县| 井研县| 连城县| 罗源县| 宜良县| 同心县| 和林格尔县| 称多县| 同江市| 萨迦县| 长岭县| 岢岚县| 九台市| 驻马店市| 禹城市| 潼南县| 莒南县| 三亚市| 五原县| 伽师县| 江源县| 库尔勒市| 屏南县| 遂溪县| 岗巴县| 隆回县| 上蔡县| 崇阳县|