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

C++實(shí)現(xiàn)LeetCode(77.Combinations 組合項(xiàng))

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

[LeetCode] 77.Combinations 組合項(xiàng)

Given two integers n and k, return all possible combinations of k numbers out of 1 ... n.

For example,
If n = 4 and k = 2, a solution is:

[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]

這道題讓求1到n共n個(gè)數(shù)字里k個(gè)數(shù)的組合數(shù)的所有情況,還是要用深度優(yōu)先搜索DFS來(lái)解,根據(jù)以往的經(jīng)驗(yàn),像這種要求出所有結(jié)果的集合,一般都是用DFS調(diào)用遞歸來(lái)解。那么我們建立一個(gè)保存最終結(jié)果的大集合res,還要定義一個(gè)保存每一個(gè)組合的小集合out,每次放一個(gè)數(shù)到out里,如果out里數(shù)個(gè)數(shù)到了k個(gè),則把out保存到最終結(jié)果中,否則在下一層中繼續(xù)調(diào)用遞歸??蓪?xiě)出代碼如下:

解法一:

class Solution {
public:
    vector<vector<int>> combine(int n, int k) {
        vector<vector<int>> res;
        vector<int> out;
        helper(n, k, 1, out, res);
        return res;
    }
    void helper(int n, int k, int level, vector<int>& out, vector<vector<int>>& res) {
        if (out.size() == k) {res.push_back(out); return;}
        for (int i = level; i <= n; ++i) {
            out.push_back(i);
            helper(n, k, i + 1, out, res);
            out.pop_back();
        }
    }
};

對(duì)于n = 5, k = 3, 處理的結(jié)果如下:

1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5

我們?cè)賮?lái)看一種遞歸的寫(xiě)法,此解法沒(méi)用helper當(dāng)遞歸函數(shù),而是把本身就當(dāng)作了遞歸函數(shù),寫(xiě)起來(lái)十分的簡(jiǎn)潔,也是非常有趣的一種解法。這個(gè)解法用到了一個(gè)重要的性質(zhì) C(n, k) = C(n-1, k-1) + C(n-1, k),這應(yīng)該在我們高中時(shí)候?qū)W排列組合的時(shí)候?qū)W過(guò)吧,博主也記不清了。總之,翻譯一下就是,在n個(gè)數(shù)中取k個(gè)數(shù)的組合項(xiàng)個(gè)數(shù),等于在n-1個(gè)數(shù)中取k-1個(gè)數(shù)的組合項(xiàng)個(gè)數(shù)再加上在n-1個(gè)數(shù)中取k個(gè)數(shù)的組合項(xiàng)個(gè)數(shù)之和。這里博主就不證明了,因?yàn)槲乙膊粫?huì),就直接舉題目中的例子來(lái)說(shuō)明吧:

C(4, 2) = C(3, 1) + C(3, 2)

我們不難寫(xiě)出 C(3, 1) 的所有情況:[1], [2], [3],還有 C(3, 2) 的所有情況:[1, 2], [1, 3], [2, 3]。我們發(fā)現(xiàn)二者加起來(lái)為6,正好是 C(4, 2) 的個(gè)數(shù)之和。但是我們仔細(xì)看會(huì)發(fā)現(xiàn),C(3, 2)的所有情況包含在 C(4, 2) 之中,但是 C(3, 1) 的每種情況只有一個(gè)數(shù)字,而我們需要的結(jié)果k=2,其實(shí)很好辦,每種情況后面都加上4,于是變成了:[1, 4], [2, 4], [3, 4],加上C(3, 2) 的所有情況:[1, 2], [1, 3], [2, 3],正好就得到了 n=4, k=2 的所有情況了。參見(jiàn)代碼如下:

解法二:

class Solution {
public:
    vector<vector<int>> combine(int n, int k) {
        if (k > n || k < 0) return {};
        if (k == 0) return {{}};
        vector<vector<int>> res = combine(n - 1, k - 1);
        for (auto &a : res) a.push_back(n);
        for (auto &a : combine(n - 1, k)) res.push_back(a);
        return res;
    }
};

我們?cè)賮?lái)看一種迭代的寫(xiě)法,也是一種比較巧妙的方法。這里每次先遞增最右邊的數(shù)字,存入結(jié)果res中,當(dāng)右邊的數(shù)字超過(guò)了n,則增加其左邊的數(shù)字,然后將當(dāng)前數(shù)組賦值為左邊的數(shù)字,再逐個(gè)遞增,直到最左邊的數(shù)字也超過(guò)了n,停止循環(huán)。對(duì)于n=4, k=2時(shí),遍歷的順序如下所示:

0 0 #initialization
1 0
1 1
1 2 #push_back
1 3 #push_back
1 4 #push_back
1 5
2 5
2 2
2 3 #push_back
2 4 #push_back
...
3 4 #push_back
3 5
4 5
4 4
4 5
5 5 #stop 

解法三:

class Solution {
public:
    vector<vector<int>> combine(int n, int k) {
        vector<vector<int>> res;
        vector<int> out(k, 0);
        int i = 0;
        while (i >= 0) {
            ++out[i];
            if (out[i] > n) --i;
            else if (i == k - 1) res.push_back(out);
            else {
                ++i;
                out[i] = out[i - 1];
            }
        }
        return res;
    }
};

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

相關(guān)文章

  • 深入java線(xiàn)程池的使用詳解

    深入java線(xiàn)程池的使用詳解

    本篇文章是對(duì)java線(xiàn)程池的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語(yǔ)言深入探究水仙花數(shù)與變種水仙花數(shù)代碼

    C語(yǔ)言深入探究水仙花數(shù)與變種水仙花數(shù)代碼

    求水仙花數(shù)和變種水仙花數(shù)是非常適合初學(xué)者學(xué)習(xí)的代碼,其中包含的循環(huán)和邏輯方式等知識(shí)點(diǎn)。這既能起到對(duì)以往知識(shí)的復(fù)習(xí),也可以學(xué)習(xí)到一種不同的邏輯思考方式
    2022-05-05
  • 教你分辨C++堆與棧的區(qū)別

    教你分辨C++堆與棧的區(qū)別

    堆與棧的區(qū)別有:1、棧由系統(tǒng)自動(dòng)分配,而堆是人為申請(qǐng)開(kāi)辟;2、棧獲得的空間較小,而堆獲得的空間較大;3、棧由系統(tǒng)自動(dòng)分配,速度較快,而堆一般速度比較慢;4、棧是連續(xù)的空間,而堆是不連續(xù)的空間
    2021-06-06
  • 如何判斷一個(gè)整數(shù)的二進(jìn)制中有多少個(gè)1

    如何判斷一個(gè)整數(shù)的二進(jìn)制中有多少個(gè)1

    本篇文章是對(duì)如何判斷一個(gè)整數(shù)的二進(jìn)制中有多少個(gè)1的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語(yǔ)言打印某一年的日歷

    C語(yǔ)言打印某一年的日歷

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言打印某一年的日歷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 基于C++的攝像頭圖像采集及拼接程序的簡(jiǎn)單實(shí)現(xiàn)

    基于C++的攝像頭圖像采集及拼接程序的簡(jiǎn)單實(shí)現(xiàn)

    本程序是在?ubuntu14.04?平臺(tái)下實(shí)現(xiàn)的,在本項(xiàng)目目錄下,已經(jīng)有編譯生成的可執(zhí)行程序,其中Camera_to_Frmae.cpp是我們從雙攝像頭實(shí)時(shí)抓取單幀圖像的源碼,對(duì)基于C++的攝像頭圖像采集及拼接程序的實(shí)現(xiàn)感興趣的朋友一起看看吧
    2022-01-01
  • 淺談C++ 虛函數(shù)分析

    淺談C++ 虛函數(shù)分析

    這篇文章主要介紹了淺談C++ 虛函數(shù)分析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • C語(yǔ)言實(shí)現(xiàn)掃雷游戲小項(xiàng)目

    C語(yǔ)言實(shí)現(xiàn)掃雷游戲小項(xiàng)目

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)掃雷游戲小項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C語(yǔ)言實(shí)現(xiàn)在控制臺(tái)打印余弦曲線(xiàn)

    C語(yǔ)言實(shí)現(xiàn)在控制臺(tái)打印余弦曲線(xiàn)

    余弦曲線(xiàn)又叫余弦波(cosinwave),是一種來(lái)自數(shù)學(xué)三角函數(shù)中的余弦比例的曲線(xiàn)。這篇文章主要為大家介紹了如何在控制臺(tái)繪制余弦曲線(xiàn),感興趣的可以了解一下
    2023-02-02
  • C++:string字符串的切片方式

    C++:string字符串的切片方式

    這篇文章主要介紹了C++:string字符串的切片方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06

最新評(píng)論

南宁市| 和顺县| 湖北省| 新沂市| 兴安盟| 永寿县| 常宁市| 方正县| 雅江县| 靖江市| 射洪县| 襄汾县| 长沙县| 湟中县| 遂川县| 泸水县| 淳安县| 新干县| 汶上县| 开鲁县| 扎鲁特旗| 安西县| 泌阳县| 宁阳县| 嘉黎县| 镇雄县| 延吉市| 陆川县| 延长县| 陇南市| 石首市| 河津市| 大新县| 商都县| 平乐县| 平舆县| 加查县| 布拖县| 邢台市| 简阳市| 云和县|