46. 全排列015(回溯法求解)
生活随笔
收集整理的這篇文章主要介紹了
46. 全排列015(回溯法求解)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一:題目
示例 1:
二:思路
1.思路:
1.這道題用的算法思想是回溯法,也就是窮舉所有的可能,所以說回溯法也是沒有辦法的方法
2.那么在這里我們選用的解的空間是 排列樹 也就是從根節點每次往下的分支減少一個
3.這里的在 backstrack 中 for循環相當于橫向遍歷,遍歷到所有的元素,縱向的就是backstrack
遞歸 尋找一種可行解,但在遞歸的時候需要記錄已經訪問過的元素,因為每次都是從開始來遍歷所有的元素
4.這里的遞歸終止條件是 path中的元素個數已經等于 nums.size()了,。這時也就還是排列樹的
的葉節點了,記錄下一個結果
2:圖解過程(其選擇的解的空間是排列樹)
這里在選擇解的空間的時候判斷其用的是排列樹:因為每次往下分支均減少一,而且排列樹的葉節點個數為 : (n-1)! 個,n為集合元素個數
三:上碼
class Solution { public:vector<vector<int>> result;vector<int>path;void backstrack(vector<int>& nums,vector<bool>& used){//遞歸終止條件 當path中已經存了一種可能if(path.size() == nums.size()){result.push_back(path);return ;}for(int i = 0; i < nums.size(); i++){if(used[i] == true) continue;path.push_back(nums[i]);used[i] = true;// 記錄已經訪問過的元素 backstrack(nums,used);//每次結束一次for循環 那么就需要將puth進去的元素剔除掉,因為最外層的for循環path.pop_back();used[i] = false;}}vector<vector<int>> permute(vector<int>& nums) {/**思路:1.這道題用的算法思想是回溯法,也就是窮舉所有的可能,所以說回溯法也是沒有辦法的方法2.那么在這里我們選用的解的空間是 排列樹 也就是從根節點每次往下的分支減少一個3.這里的在 backstrack 中 for循環相當于橫向遍歷,遍歷到所有的元素,縱向的就是backstrack遞歸 尋找一種可行解,但在遞歸的時候需要記錄已經訪問過的元素,因為每次都是從開始來遍歷所有的元素4.這里的遞歸終止條件是 path中的元素個數已經等于 nums.size()了,。這時也就還是排列樹的的葉節點了,記錄下一個結果 */vector<bool>used(nums.size(),false);backstrack(nums,used);return result;} };加油 boy!!!
總結
以上是生活随笔為你收集整理的46. 全排列015(回溯法求解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 7-3 银行家算法--综合 (50 分)
- 下一篇: iphone看漫画软件comikon使用