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

C++回溯算法中子集問題分析探討

 更新時(shí)間:2023年03月15日 09:13:02   作者:清風(fēng)何渡  
回溯法是一種選優(yōu)搜索法,按選優(yōu)條件向前搜索,以達(dá)到目標(biāo)。但當(dāng)探索到某一步時(shí),發(fā)現(xiàn)原先選擇并不優(yōu)或達(dá)不到目標(biāo),就退回一步重新選擇,這種走不通就退回再走的技術(shù)為回溯法,而滿足回溯條件的某個(gè)狀態(tài)的點(diǎn)稱為回溯點(diǎn)

一、子集

子集問題與其它問題最大的不同就是:每次遞歸,不止考慮葉子節(jié)點(diǎn),而是考慮所有節(jié)點(diǎn)!

體現(xiàn)在代碼上,就是每次遞歸都先result.push_back(path);

class Solution {
private:
    vector<int> path;
    vector<vector<int>> result;
    void backtracking(vector<int>& nums,int index){
        result.push_back(path);
        if(index>=nums.size()) 
            return;
        for(int i=index;i<nums.size();i++){
            path.push_back(nums[i]);
            backtracking(nums,i+1);
            path.pop_back();
        }
    }
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        backtracking(nums,0);
        return result;
    }
};

二、子集II

本題與上題唯一的區(qū)別在于:輸入樣例有重復(fù)數(shù)字,但又要求結(jié)果不能重復(fù)

本題與組合總和II是一個(gè)套路,即:橫向遍歷不可重復(fù),縱向遍歷可重復(fù)

體現(xiàn)在代碼上,就是if(i>index&&nums[i]==nums[i-1]) continue;

class Solution {
private:
    vector<int> path;
    vector<vector<int>> result;
    void backtracking(vector<int>& nums,int index){
        result.push_back(path);
        if(index>=nums.size()) return;
        for(int i=index;i<nums.size();i++){
            if(i>index&&nums[i]==nums[i-1])
                continue;
            path.push_back(nums[i]);
            backtracking(nums,i+1);
            path.pop_back();
        }
    }
public:
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        backtracking(nums,0);
        return result;
    }
};

三、遞增子序列

這題嚴(yán)格來說并不是子集問題,但是有一點(diǎn)希望和子集II對比一下,就是同一層元素不能重復(fù)的問題,這一題因?yàn)樵夭荒芘判?,所以在判斷元素是否重?fù)的問題上,并不能采用類似于上一題的if(i>index&&nums[i]==nums[i-1]) continue;方法,而是應(yīng)該開辟一個(gè)used數(shù)組記錄每一層元素是否已出現(xiàn)過,其實(shí)上一題也能用這種方法,不過上一題沒這個(gè)必要

還要注意used數(shù)組開辟的位置是在backtracking函數(shù)內(nèi)部,意思很明顯:used數(shù)組只管記錄本層元素,至于下一層元素,則要開辟新的ued數(shù)組來記錄

class Solution {
private:
    vector<int> path;
    vector<vector<int>> result;
    void backtracking(vector<int>& nums,int index){
        if(path.size()>1){
            result.push_back(path);
            if(index==nums.size()) return;
        }
        int used[201]={0};//記錄本層元素是否重復(fù)使用,新的一層都會(huì)重新定義
        for(int i=index;i<nums.size();i++){
            if(used[nums[i]+100]==1||(!path.empty()&&nums[i]<path.back()))
                continue;
            used[nums[i]+100]=1;
            path.push_back(nums[i]);
            backtracking(nums,i+1);
            path.pop_back();
        }
    }
public:
    vector<vector<int>> findSubsequences(vector<int>& nums) {
        backtracking(nums,0);
        return result;
    }
};

到此這篇關(guān)于C++回溯算法中子集問題分析探討的文章就介紹到這了,更多相關(guān)C++回溯算法子集內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Pipes實(shí)現(xiàn)LeetCode(195.第十行)

    Pipes實(shí)現(xiàn)LeetCode(195.第十行)

    這篇文章主要介紹了Pipes實(shí)現(xiàn)LeetCode(195.第十行),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C++多線程實(shí)現(xiàn)TCP服務(wù)器端同時(shí)和多個(gè)客戶端通信

    C++多線程實(shí)現(xiàn)TCP服務(wù)器端同時(shí)和多個(gè)客戶端通信

    通訊建立后首先由服務(wù)器端發(fā)送消息,客戶端接收消息;接著客戶端發(fā)送消息,服務(wù)器端接收消息,實(shí)現(xiàn)交互發(fā)送消息。本文主要介紹了C++多線程實(shí)現(xiàn)TCP服務(wù)器端同時(shí)和多個(gè)客戶端通信,感興趣的可以了解一下
    2021-05-05
  • OpenCV實(shí)現(xiàn)更改圖片顏色功能

    OpenCV實(shí)現(xiàn)更改圖片顏色功能

    這篇文章主要為大家詳細(xì)介紹了如何利用OpenCV實(shí)現(xiàn)更改圖片顏色的功能,文中代碼介紹詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • C++ 之 Asio 庫(全面解析)

    C++ 之 Asio 庫(全面解析)

    下面小編就為大家?guī)硪黄狢++ 之 Asio 庫(全面解析)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • C C++ 算法實(shí)例大全

    C C++ 算法實(shí)例大全

    這篇文章主要介紹了C C++ 算法實(shí)例大全,里面大量的實(shí)例介紹,學(xué)習(xí)c語言的朋友可以收藏
    2016-12-12
  • Qt實(shí)現(xiàn)右擊菜單項(xiàng)

    Qt實(shí)現(xiàn)右擊菜單項(xiàng)

    這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)右擊菜單項(xiàng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++選擇文件夾代碼的封裝

    C++選擇文件夾代碼的封裝

    這篇文章主要介紹了C++選擇文件夾代碼的封裝,實(shí)例展示了將選擇文件夾功能代碼封裝為一個(gè)類并對其進(jìn)行實(shí)例化調(diào)用的過程,對于學(xué)習(xí)C++程序設(shè)計(jì)有不錯(cuò)的參考價(jià)值,需要的朋友可以參考下
    2014-10-10
  • C語言中遞歸的實(shí)際應(yīng)用與經(jīng)典問題

    C語言中遞歸的實(shí)際應(yīng)用與經(jīng)典問題

    函數(shù)以及函數(shù)的遞歸調(diào)用是學(xué)習(xí)C語言必須要掌握的內(nèi)容,且遞歸作為經(jīng)典的算法思想被廣泛應(yīng)用于程序設(shè)計(jì)中,下面這篇文章主要給大家介紹了關(guān)于C語言中遞歸的實(shí)際應(yīng)用與經(jīng)典問題的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • C++ 頭文件系列(set)詳解

    C++ 頭文件系列(set)詳解

    一般而言,每個(gè)C++/C程序通常由頭文件和定義文件組成。頭文件作為一種包含功能函數(shù)、數(shù)據(jù)接口聲明的載體文件,主要用于保存程序的聲明,而定義文件用于保存程序的實(shí)現(xiàn) 。
    2017-02-02
  • Qt在vs2019中使用及設(shè)置方法

    Qt在vs2019中使用及設(shè)置方法

    這篇文章主要介紹了Qt在vs2019中使用及設(shè)置方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08

最新評論

潜江市| 汤阴县| 青浦区| 青川县| 江北区| 连城县| 蛟河市| 闽清县| 西和县| 永靖县| 田阳县| 德昌县| 法库县| 赤水市| 北京市| 余江县| 福鼎市| 镇远县| 茂名市| 安岳县| 晋城| 东海县| 绍兴县| 鞍山市| 如东县| 福海县| 泗洪县| 泰兴市| 阿巴嘎旗| 舒城县| 冷水江市| 民乐县| 寻甸| 喜德县| 枣阳市| 即墨市| 寿光市| 孝昌县| 西峡县| 井冈山市| 乌审旗|