日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

46. 全排列015(回溯法求解)

發布時間:2023/12/4 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 46. 全排列015(回溯法求解) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一:題目


示例 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.思路:

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(回溯法求解)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。