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

LeetCode.46. 全排列(回溯法入門)

這篇具有很好參考價值的文章主要介紹了LeetCode.46. 全排列(回溯法入門)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

寫在前面:

題目鏈接:LeetCode.46. 全排列
編程語言:C++
題目難度:中等

一、題目描述

給定一個不含重復數(shù)字的數(shù)組 nums ,返回其 所有可能的全排列 。你可以 按任意順序 返回答案。

示例 1:

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

示例2:

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

示例3:

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

提示:

1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums 中的所有整數(shù) 互不相同

二、解題思路

2.1 回溯法

我們再次用 樹狀思維邏輯,從根出發(fā),葉子節(jié)點為結(jié)果集之一
示例:
LeetCode.46. 全排列(回溯法入門)
這個樹像是做一個減法:
從這個集合里,不斷的取出一個數(shù)字,再將這個數(shù)字從當前集合中刪除掉,剩下的元素做下一次的可選值

LeetCode.46. 全排列(回溯法入門)
這里我曾經(jīng)想用一個set 保存這些值,每選一個數(shù)字,就從set 中 erase 掉這個數(shù)字,然后把這個 set 再做下一次選擇的集合,問題是每次需要初始化為一個 全集,似乎有點麻煩,這樣我們換一種思路:

維護一個 vector<bool> isUsed 數(shù)組,開始都初始化為 false ,代表每個元素都沒有用過,每當選擇其中一個元素,將該元素置為 true 代表用過了,下一次選擇的時候,只選擇 值為 false 的元素

LeetCode.46. 全排列(回溯法入門)
這里的下一次當然要使用遞歸,一直遞歸到 結(jié)果 剛好 == nums.size() , 表示這一組排列組合已經(jīng)完成了,那么如何回溯呢?
LeetCode.46. 全排列(回溯法入門)

代碼實現(xiàn):

class Solution {
public:
    vector<vector<int>> vctResult;//所有結(jié)果集
    vector<int> vctTemp;//子集
    void back(vector<int>& nums, vector<bool>& isUsed)
    {
        if(vctTemp.size() == nums.size())
        {
            vctResult.push_back(vctTemp);
            return;
        }
        for(int i = 0; i < nums.size();i++)
        {
            if(isUsed[i] == false)
            {
                vctTemp.push_back(nums[i]);//選擇該數(shù)字
                isUsed[i] = true;
                back(nums, isUsed);//遞歸繼續(xù)往下選擇
                isUsed[i] = false;//回溯
                vctTemp.pop_back();
            }
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        vector<bool> isUsed(nums.size(), false);//每個元素的使用情況
        back(nums, isUsed);
        return vctResult;
    }
};

其實回溯代碼也是有一個套路和模板的大致樣子的,例如上述題目:

result //結(jié)果
def backtrack(路徑, 選擇列表):
    if 滿足結(jié)束條件:
        reslut.push_back(結(jié)果集)
        return
    
    for 選擇列表:
        做選擇
        backtrack(路徑, 選擇列表)
        撤銷選擇

三、完整代碼

class Solution {
public:
    vector<vector<int>> vctResult;//所有結(jié)果集
    vector<int> vctTemp;//子集
    void back(vector<int>& nums, vector<bool>& isUsed)
    {
        if(vctTemp.size() == nums.size())
        {
            vctResult.push_back(vctTemp);
            return;
        }
        for(int i = 0; i < nums.size();i++)
        {
            if(isUsed[i] == false)
            {
                vctTemp.push_back(nums[i]);//選擇該數(shù)字
                isUsed[i] = true;
                back(nums, isUsed);//遞歸繼續(xù)往下選擇
                isUsed[i] = false;//回溯
                vctTemp.pop_back();
            }
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        vector<bool> isUsed(nums.size(), false);//每個元素的使用情況
        back(nums, isUsed);
        return vctResult;
    }
};

運行結(jié)果:
LeetCode.46. 全排列(回溯法入門)文章來源地址http://www.zghlxwxcb.cn/news/detail-462699.html

到了這里,關于LeetCode.46. 全排列(回溯法入門)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領支付寶紅包贊助服務器費用

相關文章

  • Day31 46全排列 47全排列II 回溯去重tips 51N皇后 37解數(shù)獨

    Day31 46全排列 47全排列II 回溯去重tips 51N皇后 37解數(shù)獨

    給定一個 沒有重復 數(shù)字的序列,返回其所有可能的全排列。 示例: 輸入: [1,2,3] 輸出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] ?排列問題與組合問題的不同之處就在于,沒有startIndex,同時需要設置一個used數(shù)組,遍歷過的就設置成true,下次遇到時跳過。 給定一個可包含重

    2024年01月20日
    瀏覽(22)
  • LeetCode刷題——46.全排列

    LeetCode刷題——46.全排列

    給定一個不含重復數(shù)字的數(shù)組 nums ,返回其 所有可能的全排列 。你可以 按任意順序 返回答案。 【遞歸實現(xiàn)】

    2024年02月12日
    瀏覽(25)
  • LeetCode 46 全排列

    全排列 給定一個不含重復數(shù)字的數(shù)組 nums ,返回其 所有可能的全排列 。你可以 按任意順序 返回答案。 示例 1: 示例 2: 示例 3: 提示: 1 = nums.length = 6 -10 = nums[i] = 10 nums 中的所有整數(shù) 互不相同 回溯法 這個問題可以看作有 n 個排列成一行的空格,我們需要從左往右依此填

    2024年01月19日
    瀏覽(15)
  • 【LeetCode-中等題】46. 全排列

    【LeetCode-中等題】46. 全排列

    1、子集去重版本 2、組合去重版本 3、子集非去重版本 這題中nums中的數(shù)各不相同,所以不需要去重: 而下面這題,nums中的數(shù)會存在重復值,就需要去重: 參考講解視頻:代碼隨想錄—全排列不去重版本 關鍵在于遞歸之后還要還原做回溯動作: 所以最后,我們統(tǒng)計到的res才

    2024年02月09日
    瀏覽(20)
  • LeetCode(力扣)46. 全排列Python

    LeetCode(力扣)46. 全排列Python

    https://leetcode.cn/problems/permutations/

    2024年02月09日
    瀏覽(19)
  • C++ | Leetcode C++題解之第46題全排列

    C++ | Leetcode C++題解之第46題全排列

    題目: 題解:

    2024年04月24日
    瀏覽(23)
  • leetcode--回溯算法.全排列(java)

    leetcode 46 原題鏈接-- 全排列 題目描述: 給定一個不含重復數(shù)字的數(shù)組 nums ,返回其 所有可能的全排列 。你可以 按任意順序 返回答案。 示例1: 輸入:nums = [1,2,3] 輸出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 示例2: 輸入:nums = [0,1] 輸出:[[0,1],[1,0]] 示例3: 輸入:nums = [1

    2024年02月08日
    瀏覽(24)
  • LeetCode 1079. Letter Tile Possibilities【哈希表,回溯,動態(tài)規(guī)劃,排列組合】中等

    本文屬于「征服LeetCode」系列文章之一,這一系列正式開始于2021/08/12。由于LeetCode上部分題目有鎖,本系列將至少持續(xù)到刷完所有無鎖題之日為止;由于LeetCode還在不斷地創(chuàng)建新題,本系列的終止日期可能是永遠。在這一系列刷題文章中,我不僅會講解多種解題思路及其優(yōu)化,

    2024年02月10日
    瀏覽(25)
  • 力扣 46. 全排列

    力扣 46. 全排列

    題目來源:https://leetcode.cn/problems/permutations/description/ ? C++題解: 全排列每一次都需要從第一個元素開始遍歷,所以不用ind標記開始元素,都從0開始,但需要一個數(shù)組used不斷更新哪些元素已經(jīng)被使用,遍歷到使用過的元素跳過即可。

    2024年02月12日
    瀏覽(23)
  • 回溯算法篇-01:全排列

    回溯算法篇-01:全排列

    這道題屬于上一篇——“回溯算法解題框架與思路”中的 “元素不重復不可復用” 那一類中的 排列類問題。 我們來回顧一下當時是怎么說的: 排列和組合的區(qū)別在于,排列對“順序”有要求。比如 [1,2] 和 [2,1] 是兩個不同的結(jié)果。 這就導致了同一個元素 在同一條路徑中不

    2024年01月20日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領取紅包

二維碼2

領紅包