46. 全排列015(回溯法求解)
生活随笔
收集整理的這篇文章主要介紹了
46. 全排列015(回溯法求解)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一:題目
示例 1:
二:思路
1.思路:
1.這道題用的算法思想是回溯法,也就是窮舉所有的可能,所以說(shuō)回溯法也是沒(méi)有辦法的方法
2.那么在這里我們選用的解的空間是 排列樹(shù) 也就是從根節(jié)點(diǎn)每次往下的分支減少一個(gè)
3.這里的在 backstrack 中 for循環(huán)相當(dāng)于橫向遍歷,遍歷到所有的元素,縱向的就是backstrack
遞歸 尋找一種可行解,但在遞歸的時(shí)候需要記錄已經(jīng)訪(fǎng)問(wèn)過(guò)的元素,因?yàn)槊看味际菑拈_(kāi)始來(lái)遍歷所有的元素
4.這里的遞歸終止條件是 path中的元素個(gè)數(shù)已經(jīng)等于 nums.size()了,。這時(shí)也就還是排列樹(shù)的
的葉節(jié)點(diǎn)了,記錄下一個(gè)結(jié)果
2:圖解過(guò)程(其選擇的解的空間是排列樹(shù))
這里在選擇解的空間的時(shí)候判斷其用的是排列樹(shù):因?yàn)槊看瓮路种Ь鶞p少一,而且排列樹(shù)的葉節(jié)點(diǎn)個(gè)數(shù)為 : (n-1)! 個(gè),n為集合元素個(gè)數(shù)
三:上碼
class Solution { public:vector<vector<int>> result;vector<int>path;void backstrack(vector<int>& nums,vector<bool>& used){//遞歸終止條件 當(dāng)path中已經(jīng)存了一種可能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;// 記錄已經(jīng)訪(fǎng)問(wèn)過(guò)的元素 backstrack(nums,used);//每次結(jié)束一次for循環(huán) 那么就需要將puth進(jìn)去的元素剔除掉,因?yàn)樽钔鈱拥膄or循環(huán)path.pop_back();used[i] = false;}}vector<vector<int>> permute(vector<int>& nums) {/**思路:1.這道題用的算法思想是回溯法,也就是窮舉所有的可能,所以說(shuō)回溯法也是沒(méi)有辦法的方法2.那么在這里我們選用的解的空間是 排列樹(shù) 也就是從根節(jié)點(diǎn)每次往下的分支減少一個(gè)3.這里的在 backstrack 中 for循環(huán)相當(dāng)于橫向遍歷,遍歷到所有的元素,縱向的就是backstrack遞歸 尋找一種可行解,但在遞歸的時(shí)候需要記錄已經(jīng)訪(fǎng)問(wèn)過(guò)的元素,因?yàn)槊看味际菑拈_(kāi)始來(lái)遍歷所有的元素4.這里的遞歸終止條件是 path中的元素個(gè)數(shù)已經(jīng)等于 nums.size()了,。這時(shí)也就還是排列樹(shù)的的葉節(jié)點(diǎn)了,記錄下一個(gè)結(jié)果 */vector<bool>used(nums.size(),false);backstrack(nums,used);return result;} };加油 boy!!!
總結(jié)
以上是生活随笔為你收集整理的46. 全排列015(回溯法求解)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 7-3 银行家算法--综合 (50 分)
- 下一篇: iphone看漫画软件comikon使用