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

C++回溯算法中的全排列問題分析探討

 更新時間:2023年03月15日 09:06:01   作者:清風何渡  
遞歸中遇到一個問題全排列的問題,我看見回溯特別神奇,特此記錄一下。對比一下深度優(yōu)先搜索與廣度優(yōu)先搜索,個人感覺這里的回溯像是一種遞歸樹中的深度優(yōu)先搜索的算法,他不斷構造往下延伸的深度,使其達到完全編列

一、全排列

全排列的特點就是:解放了index(每次遍歷都從0開始),但是解放index的同時,又捆綁了used數組,記錄已經出現(xiàn)過的元素

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

二、全排列II

本題與全排列唯一不同在于需要去重這題與上一題唯一區(qū)別在于輸入樣例為可重復序列,且要求輸出樣例不重復

對于全排列問題,模板是設置used數組,只有used[i]==0時,才能選擇該元素

對于去重問題,模板是先對nums排序,再判斷nums[i]與nums[i-1]是否相等

根據全排列問題模板,設置used數組,只有used[i]==0時才可以選擇

根據去重模板,先對nums排序,再判斷nums[i]與nums[i-1]是否相等

但是全排列的去重沒那么簡單,因為全排列i是從0開始遍歷,因此還要記錄同一層當前已經訪問到哪兒了,同一層不可以重復,但是同一樹枝可以重復

但是不必再設置index,因為used數組可以兼任這個功能

如果used[i-1]==1,說明在同一個樹枝訪問過nums[i-1],同一樹枝可以重復

如果used[i-1]==0,說明在同一層訪問過nums[i-1],同一層不可以重復

很繞~

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

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

相關文章

  • C++中的類擴展之繼承和組合詳解

    C++中的類擴展之繼承和組合詳解

    在C++中,類擴展可以通過繼承、組合和裝飾模式實現(xiàn)。繼承可以實現(xiàn)對已有類的修改和擴展,組合可以增加新的功能,裝飾模式則能夠在不改變原類的情況下為其添加新的功能。這些技術在C++程序設計中應用廣泛,提高了程序的可擴展性和可維護性
    2023-04-04
  • Qt中QPainter與坐標的使用

    Qt中QPainter與坐標的使用

    本文主要介紹了Qt中QPainter與坐標的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • 類成員函數的重載、覆蓋與隱藏之間的區(qū)別總結

    類成員函數的重載、覆蓋與隱藏之間的區(qū)別總結

    以下是對類成員函數的重載、覆蓋與隱藏之間的區(qū)別進行了詳細的總結分析,需要的朋友可以過來參考下。希望對大家有所幫助
    2013-10-10
  • C語言二維數組應用實現(xiàn)掃雷游戲

    C語言二維數組應用實現(xiàn)掃雷游戲

    這篇文章主要為大家詳細介紹了C語言二維數組應用實現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++命名空間和缺省參數介紹

    C++命名空間和缺省參數介紹

    這篇文章主要介紹了C++命名空間和缺省參數,使用命名空間的目的是對標識符的名稱進行本地化,以避免命名沖突或名字污染,namespace關鍵字的出現(xiàn)就是針對這種問題的,缺省參數是聲明或定義函數時為函數的參數指定一個默認值,更多詳細內容需要的小伙伴可以參考下面文章內容
    2022-01-01
  • 一波二叉樹遍歷問題的C++解答實例分享

    一波二叉樹遍歷問題的C++解答實例分享

    這篇文章主要介紹了一波二叉樹遍歷問題的C++解答實例分享,包括節(jié)點打印和轉換為鏡像等問題的解答,需要的朋友可以參考下
    2016-02-02
  • c語言中unsigned修飾符的使用

    c語言中unsigned修飾符的使用

    在C語言中,unsigned是一種無符號整數修飾符,本文主要介紹了c語言中unsigned修飾符的使用,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • C++中的繼承方式與菱形繼承解析

    C++中的繼承方式與菱形繼承解析

    這篇文章主要介紹了C++中的繼承方式與菱形繼承解析,繼承是類和類之間的關系,是代碼復用的重要手段,允許在保持原有類結構的基礎上進行擴展,創(chuàng)建的新類與原有的類類似,只是多了幾個成員變量和成員函數,需要的朋友可以參考下
    2023-08-08
  • C語言 奇偶排序算法詳解及實例代碼

    C語言 奇偶排序算法詳解及實例代碼

    這篇文章主要介紹了C語言 奇偶排序算法詳解及實例代碼的相關資料,需要的朋友可以參考下
    2016-11-11
  • C++實現(xiàn)折半插入排序(BinaryInsertSort)

    C++實現(xiàn)折半插入排序(BinaryInsertSort)

    這篇文章主要為大家詳細介紹了C++實現(xiàn)折半插入排序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04

最新評論

鱼台县| 湘潭县| 铅山县| 白河县| 广元市| 南皮县| 卫辉市| 调兵山市| 碌曲县| 锡林浩特市| 两当县| 千阳县| 丹阳市| 永修县| 启东市| 顺昌县| 紫金县| 南江县| 小金县| 淅川县| 宁陵县| 耿马| 额尔古纳市| 马龙县| 体育| 棋牌| 离岛区| 商南县| 颍上县| 开化县| 东至县| 彝良县| 漾濞| 个旧市| 塔河县| 新巴尔虎左旗| 遂溪县| 福州市| 江安县| 长宁区| 抚州市|