国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

代碼隨想錄-回溯算法(子集問(wèn)題)|ACM模式

這篇具有很好參考價(jià)值的文章主要介紹了代碼隨想錄-回溯算法(子集問(wèn)題)|ACM模式。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

前言:

78. 子集

題目描述:

輸入輸出描述:

思路和想法:

90. 子集 II

題目描述:

輸入輸出描述:

思路和想法:

491. 遞增子序列

題目描述:

輸入輸出描述:

思路和想法:


前言:

如果把 子集問(wèn)題、組合問(wèn)題、分割問(wèn)題都抽象為一棵樹的話,那么組合問(wèn)題和分割問(wèn)題都是收集樹的葉子節(jié)點(diǎn),而子集問(wèn)題是找樹的所有節(jié)點(diǎn)

子集是無(wú)序的,取過(guò)的元素不會(huì)重復(fù)取,寫回溯算法的時(shí)候,for就要從Index開始。

之后討論的問(wèn)題,分為兩種:

  • 集合里無(wú)重復(fù)元素
  • 集合里有重復(fù)元素,求取的子集需要進(jìn)行去重(可排序)
  • 集合中找遞增子集(不可排序)

78. 子集

題目描述:

給你一個(gè)整數(shù)數(shù)組 nums ,數(shù)組中的元素 互不相同 。返回該數(shù)組所有可能的子集(冪集)。

解集 不能 包含重復(fù)的子集。你可以按 任意順序 返回解集。

輸入輸出描述:

示例1:

輸入:nums = [1,2,3] 輸出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

示例2:

輸入:nums = [0] 輸出:[[],[0]]

提示:

  • 1 <= nums.length <= 10
  • -10 <= nums[i] <= 10
  • nums 中的所有元素 互不相同

思路和想法:

這一道題是模板題,可以從這道題感受子集問(wèn)題解法與之前的不同。

#include <bits/stdc++.h>

using namespace std;
/*
* 作者:希希霧里
* 78. 子集
* */
vector<vector<int>> result;
vector<int> path;

/*
* 函數(shù):          backtracing()
* 輸入?yún)?shù):       s:輸入的字符串    index:數(shù)組元素下標(biāo)
* */
void backtracing(vector<int> &nums,int Index){
    result.push_back(path);
    //回溯過(guò)程
    for (int i = Index; i < nums.size(); ++i) {
        path.push_back(nums[i]);
        backtracing(nums,i + 1);
        path.pop_back();
    }
};


int main() {
    result.clear();
    path.clear();

    int num;
    vector<int> nums;
    while(cin>>num){
        nums.push_back(num);
        if(getchar() == '\n'){
            break;
        }
    }

    backtracing(nums,0);
    cout << "[";
    for (int i = 0; i < result.size(); ++i) {
        cout << "[";
        for (int j = 0; j < result[i].size(); ++j) {
            cout<< result[i][j];
            if(j != result[i].size() - 1) cout << ",";
        }
        cout << "]";
        if(i != result.size() - 1)  {cout << ",";}
    }
    cout << "]";
    return 0;
}

/*  測(cè)試樣例
1 2 3

0
*
* */

90. 子集 II

題目描述:

給你一個(gè)整數(shù)數(shù)組 nums ,其中可能包含重復(fù)元素,請(qǐng)你返回該數(shù)組所有可能的子集(冪集)。

解集 不能 包含重復(fù)的子集。返回的解集中,子集可以按 任意順序 排列。

輸入輸出描述:

示例1:

輸入:nums = [1,2,2] 輸出:[[],[1],[1,2],[1,2,2],[2],[2,2]]

示例2:

輸入:nums = [0] 輸出:[[],[0]]

提示:

  • 1 <= nums.length <= 10
  • -10 <= nums[i] <= 10

思路和想法:

這道題目和上一道題之間的區(qū)別:集合里有了重復(fù)元素,而且求取的子集要進(jìn)行去重。

所以在上一道題的基礎(chǔ)上,引入樹層去重,這道題目可以參考回溯算法中組合問(wèn)題里的40.組合總和II。

#include <bits/stdc++.h>

using namespace std;
/*
* 作者:希希霧里
* 90. 子集II
* */
vector<vector<int>> result;
vector<int> path;

/*
* 函數(shù):          backtracing()
* 輸入?yún)?shù):       s:輸入的字符串    index:數(shù)組元素下標(biāo)  used:使用過(guò)的標(biāo)志
* */
void backtracing(vector<int> &nums,int Index, vector<bool> used){
    result.push_back(path);
    //回溯過(guò)程
    for (int i = Index; i < nums.size(); ++i) {
        // used[i - 1] == true,說(shuō)明同一樹枝nums[i - 1]使用過(guò)
        // used[i - 1] == false,說(shuō)明同一樹層nums[i - 1]使用過(guò)
        // 這里注意樹層和樹枝的區(qū)別,這里我們是對(duì)樹層進(jìn)行跳過(guò)。
        if(i > 0 && nums[i] == nums[i - 1] && used[i - 1] == false){
            continue;
        }
        path.push_back(nums[i]);
        used[i] = true;
        backtracing(nums,i + 1,used);
        used[i] = false;
        path.pop_back();
    }
};


int main() {
    result.clear();
    path.clear();

    int num;
    vector<int> nums;
    while(cin>>num){
        nums.push_back(num);
        if(getchar() == '\n'){
            break;
        }
    }
    vector<bool> used(nums.size(), false);
    sort(nums.begin(),nums.end());
    backtracing(nums,0,used);

    //輸出模式
    cout << "[";
    for (int i = 0; i < result.size(); ++i) {
        cout << "[";
        for (int j = 0; j < result[i].size(); ++j) {
            cout<< result[i][j];
            if(j != result[i].size() - 1) cout << ",";
        }
        cout << "]";
        if(i != result.size() - 1)  {cout << ",";}
    }
    cout << "]";
    return 0;
}

/*  測(cè)試樣例
1 2 2

0
*
* */

491. 遞增子序列

題目描述:

給你一個(gè)整數(shù)數(shù)組 nums ,找出并返回所有該數(shù)組中不同的遞增子序列,遞增子序列中 至少有兩個(gè)元素 。你可以按 任意順序 返回答案。

數(shù)組中可能含有重復(fù)元素,如出現(xiàn)兩個(gè)整數(shù)相等,也可以視作遞增序列的一種特殊情況。

輸入輸出描述:

示例1:

輸入:nums = [4,6,7,7] 輸出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]

示例2:

輸入:nums = [4,4,3,2,1] 輸出:[[4,4]]

提示:

  • 1 <= nums.length <= 15
  • -100 <= nums[i] <= 100

思路和想法:

這道題目相較于上一道題子集II有什么區(qū)別,這道題是要在數(shù)組中找到不同的遞增子序列,所以不能對(duì)原數(shù)組進(jìn)行排序

所以去重的方法,不能用原來(lái)的邏輯,這道題目還是進(jìn)行樹層去重,這里采用set來(lái)實(shí)現(xiàn)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-618247.html

#include <bits/stdc++.h>

using namespace std;
/*
* 作者:希希霧里
* 491. 遞增子序列
* */
vector<vector<int>> result;
vector<int> path;

/*
* 函數(shù):          backtracing()
* 輸入?yún)?shù):       s:輸入的字符串    index:數(shù)組元素下標(biāo)
* */
void backtracing(vector<int> &nums,int Index){
    if(path.size() > 1){
        result.push_back(path);
    }
    //回溯過(guò)程
    unordered_set<int> uset;    //使用set對(duì)本層元素進(jìn)行去重,新的一層會(huì)重新定義清空的
    for (int i = Index; i < nums.size(); ++i) {
        if((!path.empty() && nums[i] < path.back()) || uset.find(nums[i]) != uset.end()){
            continue;
        }

        uset.insert(nums[i]);
        path.push_back(nums[i]);
        backtracing(nums,i + 1);
        path.pop_back();
    }
};


int main() {
    result.clear();
    path.clear();

    int num;
    vector<int> nums;
    while(cin>>num){
        nums.push_back(num);
        if(getchar() == '\n'){
            break;
        }
    }

    backtracing(nums,0);

    //輸出模式
    cout << "[";
    for (int i = 0; i < result.size(); ++i) {
        cout << "[";
        for (int j = 0; j < result[i].size(); ++j) {
            cout<< result[i][j];
            if(j != result[i].size() - 1) cout << ",";
        }
        cout << "]";
        if(i != result.size() - 1)  {cout << ",";}
    }
    cout << "]";
    return 0;
}

/*  測(cè)試樣例
4 6 7 7

4 4 3 2 1
*
* */

到了這里,關(guān)于代碼隨想錄-回溯算法(子集問(wèn)題)|ACM模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 代碼隨想錄算法訓(xùn)練DAY27|回溯3

    代碼隨想錄算法訓(xùn)練DAY27|回溯3

    力扣題目鏈接 給定一個(gè)無(wú)重復(fù)元素的數(shù)組 candidates 和一個(gè)目標(biāo)數(shù) target ,找出 candidates 中所有可以使數(shù)字和為 target 的組合。 candidates 中的數(shù)字可以無(wú)限制重復(fù)被選取。 說(shuō)明: 所有數(shù)字(包括 target)都是正整數(shù)。 解集不能包含重復(fù)的組合。 示例 1: 輸入:candidates = [2,3,6,

    2024年01月23日
    瀏覽(92)
  • 代碼隨想錄day42|背包問(wèn)題、416. 分割等和子集

    代碼隨想錄day42|背包問(wèn)題、416. 分割等和子集

    ?背包問(wèn)題: ? ?01 背包 二維數(shù)組dp[i][j]解法 純01背包:有n件物品和一個(gè)最多能背重量為w 的背包。第i件物品的重量是weight[i],得到的價(jià)值是value[i] 。 每件物品只能用一次 ,求解將哪些物品裝入背包里物品價(jià)值總和最大。 dp[i][j]:從下標(biāo)為[0-i]的物品里任意取,放進(jìn)容量為j的

    2024年04月09日
    瀏覽(89)
  • 代碼隨想錄 - Day34 - 回溯:遞增子序列+排列問(wèn)題

    如果有相等的整數(shù)也算遞增序列 遞增子序列中 至少有兩個(gè)元素 (遍歷的時(shí)候不用遍歷 nums 中最后一個(gè)元素) 題目說(shuō)了數(shù)值范圍,所以還可以用哈希表去重,速度比 set() 快很多。 但是,個(gè)人覺(jué)得沒(méi)必要,因?yàn)榉旁趯?shí)際情況中一般不會(huì)給數(shù)值范圍。 全排列,即 [1,2] 和 [2,1] 算作

    2024年02月09日
    瀏覽(98)
  • 代碼隨想錄 Day35 動(dòng)態(tài)規(guī)劃04 01背包問(wèn)題和完全背包問(wèn)題 LeetCode T416 分割等和子集

    代碼隨想錄 Day35 動(dòng)態(tài)規(guī)劃04 01背包問(wèn)題和完全背包問(wèn)題 LeetCode T416 分割等和子集

    說(shuō)到背包問(wèn)題大家都會(huì)想到使用動(dòng)規(guī)的方式來(lái)求解,那么為什么用動(dòng)規(guī)呢, dp數(shù)組代表什么呢 ? 初始化是什么 , 遍歷方式又是什么 ,這篇文章筆者將詳細(xì)講解背包問(wèn)題的經(jīng)典例題0-1背包問(wèn)題和完全背包問(wèn)題的解題方式,希望能幫助到大家 有人一提到背包問(wèn)題就只會(huì)使用動(dòng)態(tài)規(guī)劃來(lái)

    2024年02月06日
    瀏覽(124)
  • 代碼隨想錄23| 93.復(fù)原IP地址, 78.子集, 90.子集II

    題目鏈接/文章講解:鏈接地址 視頻講解:鏈接地址 題目鏈接/文章講解:鏈接地址 視頻講解:鏈接地址 題目鏈接/文章講解:鏈接地址 視頻講解:鏈接地址

    2024年02月11日
    瀏覽(86)
  • 代碼隨想錄——回溯

    代碼隨想錄——回溯

    代碼隨想錄——回溯 回溯的本質(zhì)就是遞歸遍歷,但在完成某一條路之后會(huì)撤回到上一層,然后重新選擇另一條路繼續(xù)遍歷,是一個(gè)比較低效的算法,能進(jìn)行提升的方式就是剪枝。 組合 鏈接:https://leetcode.cn/problems/combinations/description/ vectorvector int 作為最終返回的結(jié)果,vector

    2024年01月19日
    瀏覽(594)
  • 代碼隨想錄二刷 |回溯 |分割回文串

    131.分割回文串 給定一個(gè)字符串 s,將 s 分割成一些子串,使每個(gè)子串都是回文串。 返回 s 所有可能的分割方案。 示例: 輸入: “aab” 輸出: [ [“aa”,“b”], [“a”,“a”,“b”] ] 回溯三部曲 遞歸函數(shù)參數(shù) 全局變量數(shù)組path存放切割后回文的子串,二維數(shù)組result存放結(jié)果集 參數(shù)

    2024年01月24日
    瀏覽(303)
  • 代碼隨想錄閱讀筆記-回溯【電話號(hào)碼的字母組合】

    代碼隨想錄閱讀筆記-回溯【電話號(hào)碼的字母組合】

    題目 給定一個(gè)僅包含數(shù)字 2-9 的字符串,返回所有它能表示的字母組合。 給出數(shù)字到字母的映射如下(與電話按鍵相同)。注意 1 不對(duì)應(yīng)任何字母。 示例: 輸入:\\\"23\\\" 輸出:[\\\"ad\\\", \\\"ae\\\", \\\"af\\\", \\\"bd\\\", \\\"be\\\", \\\"bf\\\", \\\"cd\\\", \\\"ce\\\", \\\"cf\\\"]. 說(shuō)明:盡管上面的答案是按字典序排列的,但是你可以任意

    2024年04月13日
    瀏覽(91)
  • 【Day42】代碼隨想錄之動(dòng)態(tài)規(guī)劃0-1背包_416. 分割等和子集

    【Day42】代碼隨想錄之動(dòng)態(tài)規(guī)劃0-1背包_416. 分割等和子集

    動(dòng)態(tài)規(guī)劃理論基礎(chǔ) 動(dòng)規(guī)五部曲: 確定dp數(shù)組 下標(biāo)及dp[i] 的含義。 遞推公式:比如斐波那契數(shù)列 dp[i] = dp[i-1] + dp[i-2]。 初始化dp數(shù)組。 確定遍歷順序:從前到后or其他。 推導(dǎo)dp數(shù)組。 出現(xiàn)結(jié)果不正確: 打印dp日志和自己想的一樣:遞推公式、初始化或者遍歷順序出錯(cuò)。 打印

    2024年02月20日
    瀏覽(97)
  • 代碼隨想錄刷題筆記 DAY 28 | 復(fù)原 IP 地址 No.93 | 子集 No.78 | 子集 II No.90

    代碼隨想錄刷題筆記 DAY 28 | 復(fù)原 IP 地址 No.93 | 子集 No.78 | 子集 II No.90

    01. 復(fù)原 IP 地址(No. 93) 題目鏈接 代碼隨想錄題解 1.1 題目 有效 IP 地址 正好由四個(gè)整數(shù)(每個(gè)整數(shù)位于 0 到 255 之間組成,且不能含有前導(dǎo) 0 ),整數(shù)之間用 \\\'.\\\' 分隔。 例如: \\\"0.1.2.201\\\" 和 \\\"192.168.1.1\\\" 是 有效 IP 地址,但是 \\\"0.011.255.245\\\" 、 \\\"192.168.1.312\\\" 和 \\\"192.168@1.1\\\" 是 無(wú)效 I

    2024年02月22日
    瀏覽(96)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包