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

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

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

[LeetCode] 18. 4Sum 四數(shù)之和

Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.

Note:

  • Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, abcd)
  • The solution set must not contain duplicate quadruplets.

    For example, given array S = {1 0 -1 0 -2 2}, and target = 0.

A solution set is:
(-1,  0, 0, 1)
(-2, -1, 1, 2)
(-2,  0, 0, 2)

LeetCode 中關(guān)于數(shù)字之和還有其他幾道,分別是 Two Sum ,3Sum ,3Sum Closest,雖然難度在遞增,但是整體的套路都是一樣的,在這里為了避免重復(fù)項(xiàng),我們使用了 STL 中的 TreeSet,其特點(diǎn)是不能有重復(fù),如果新加入的數(shù)在 TreeSet 中原本就存在的話,插入操作就會(huì)失敗,這樣能很好的避免的重復(fù)項(xiàng)的存在。此題的 O(n^3) 解法的思路跟 3Sum 基本沒啥區(qū)別,就是多加了一層 for 循環(huán),其他的都一樣,代碼如下:

解法一:

class Solution {
public:
    vector<vector<int>> fourSum(vector<int> &nums, int target) {
        set<vector<int>> res;
        sort(nums.begin(), nums.end());
        for (int i = 0; i < int(nums.size() - 3); ++i) {
            for (int j = i + 1; j < int(nums.size() - 2); ++j) {
                if (j > i + 1 && nums[j] == nums[j - 1]) continue;
                int left = j + 1, right = nums.size() - 1;
                while (left < right) {
                    int sum = nums[i] + nums[j] + nums[left] + nums[right];
                    if (sum == target) {
                        vector<int> out{nums[i], nums[j], nums[left], nums[right]};
                        res.insert(out);
                        ++left; --right;
                    } else if (sum < target) ++left;
                    else --right;
                }
            }
        }
        return vector<vector<int>>(res.begin(), res.end());
    }
};

但是畢竟用 TreeSet 來進(jìn)行去重復(fù)的處理還是有些取巧,可能在 Java 中就不能這么做,那么還是來看一種比較正統(tǒng)的做法吧,手動(dòng)進(jìn)行去重復(fù)處理。主要可以進(jìn)行的有三個(gè)地方,首先在兩個(gè) for 循環(huán)下可以各放一個(gè),因?yàn)橐坏┊?dāng)前的數(shù)字跟上面處理過的數(shù)字相同了,那么找下來肯定還是重復(fù)的。之后就是當(dāng) sum 等于 target 的時(shí)候了,在將四個(gè)數(shù)字加入結(jié)果 res 之后,left 和 right 都需要去重復(fù)處理,分別像各自的方面遍歷即可,參見代碼如下:

解法二:

class Solution {
public:
    vector<vector<int>> fourSum(vector<int> &nums, int target) {
        vector<vector<int>> res;
        int n = nums.size();
        sort(nums.begin(), nums.end());
        for (int i = 0; i < n - 3; ++i) {
            if (i > 0 && nums[i] == nums[i - 1]) continue;
            for (int j = i + 1; j < n - 2; ++j) {
                if (j > i + 1 && nums[j] == nums[j - 1]) continue;
                int left = j + 1, right = n - 1;
                while (left < right) {
                    int sum = nums[i] + nums[j] + nums[left] + nums[right];
                    if (sum == target) {
                        vector<int> out{nums[i], nums[j], nums[left], nums[right]};
                        res.push_back(out);
                        while (left < right && nums[left] == nums[left + 1]) ++left;
                        while (left < right && nums[right] == nums[right - 1]) --right;
                        ++left; --right;
                    } else if (sum < target) ++left;
                    else --right;
                }
            }
        }
        return res;
    }
};

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

相關(guān)文章

  • Qt計(jì)時(shí)器使用方法詳解

    Qt計(jì)時(shí)器使用方法詳解

    這篇文章為大家詳細(xì)主要介紹了Qt計(jì)時(shí)器的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C語言編程數(shù)據(jù)在內(nèi)存中的存儲(chǔ)詳解

    C語言編程數(shù)據(jù)在內(nèi)存中的存儲(chǔ)詳解

    本篇文章是C語言編程篇,主要為大家介紹C語言編程中數(shù)據(jù)在內(nèi)存中存儲(chǔ)解析,有需要的朋友可以借鑒參考下,希望可以有所幫助
    2021-09-09
  • C++模板非類型形參的詳細(xì)講解

    C++模板非類型形參的詳細(xì)講解

    這篇文章主要給大家介紹了關(guān)于C++模板非類型形參的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作就有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-11-11
  • C語言實(shí)現(xiàn)五子棋游戲

    C語言實(shí)現(xiàn)五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了C語言五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • c語言求兩個(gè)字符串的交集

    c語言求兩個(gè)字符串的交集

    大家好,本篇文章主要講的是c語言求兩個(gè)字符串的交集,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • C語言 sizeof 函數(shù)詳情

    C語言 sizeof 函數(shù)詳情

    這篇文章主要介紹了C語言 sizeof 函數(shù),在 C 語言中,char 字符串也是一種非常重要的數(shù)據(jù)類型,我們除了使用 sizeof 函數(shù)獲取字符串長(zhǎng)度之外,使用 sizeof 函數(shù)同樣也可以完成字符串長(zhǎng)度的獲取,下面文章內(nèi)容具體描述該內(nèi)容,需要的朋友可以參考以下
    2021-10-10
  • C/C++指針和取地址的方法

    C/C++指針和取地址的方法

    C/C++指針和取地址的方法,需要的朋友可以參考一下
    2013-04-04
  • C++ 學(xué)習(xí)之旅三 我和超級(jí)瑪麗有個(gè)約會(huì)

    C++ 學(xué)習(xí)之旅三 我和超級(jí)瑪麗有個(gè)約會(huì)

    學(xué)習(xí)了c++有一周有余了吧,感謝孫鑫老師的視頻教程,讓我   對(duì)C++有了基本的了解,并理解到C++與.net 的許許多多的區(qū)別,更要感謝網(wǎng)民為programaking的人,會(huì)為我提供了超級(jí)瑪麗制作揭秘 這套寶貴的教程,讓我 做做出了這個(gè)項(xiàng)目,對(duì)c++ 有了一個(gè)更深層次的認(rèn)識(shí)
    2012-11-11
  • c++ *運(yùn)算符重載

    c++ *運(yùn)算符重載

    運(yùn)算符重載重載運(yùn)算符是C++ 的一個(gè)重要特性,使用運(yùn)算符重載, 的一個(gè)重要特性,使用運(yùn)算符重載, 重載運(yùn)算符是程序員可以把C++ 運(yùn)算符的定義擴(kuò)展到運(yùn)算分量是對(duì)象
    2014-09-09
  • C語言結(jié)構(gòu)體struct詳解

    C語言結(jié)構(gòu)體struct詳解

    C語言中,結(jié)構(gòu)體類型屬于一種構(gòu)造類型(其他的構(gòu)造類型還有:數(shù)組類型,聯(lián)合類型),下面這篇文章主要給大家介紹了關(guān)于C語言結(jié)構(gòu)體(struct)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09

最新評(píng)論

江安县| 北京市| 民乐县| 石河子市| 当阳市| 祥云县| 丰都县| 共和县| 天等县| 土默特右旗| 壶关县| 永丰县| 灵武市| 宿松县| 安庆市| 永兴县| 九江县| 南靖县| 页游| 平原县| 中阳县| 阜平县| 乐清市| 鸡泽县| 周至县| 景谷| 天长市| 沙洋县| 来凤县| 阿鲁科尔沁旗| 凤冈县| 嘉兴市| 乐东| 磴口县| 峨眉山市| 闻喜县| 吉林市| 聂拉木县| 新闻| 乌恰县| 繁昌县|