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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

回溯算法之全排列问题

發布時間:2025/3/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 回溯算法之全排列问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

解法框架

【README】回溯算法基本框架

全排列問題(點擊跳轉)

首先我們需要仔細觀察函數的返回值和形參等(這里我使用的C++,因為它處理數組,字符串特別方便),這里形參是一個vector的引用,也就是一個數組,那么它肯定可以作為選擇列表,返回值則是一個二維數組,二維數組中每一個元素保存的是一個正確的返回結果

那么這里我們就對應起來了,返回是二維數組,二維數組中的每項都是一個vector,所以咋們的路徑也一定是一個vector,每次達到結束條件之后,把一個路徑作為二維數組的一項添加進去。

于是在全局定義,二維數組,在函數內部定義路徑

好的下一步就是回溯算法核心:遍歷決策樹
遍歷一個決策樹的遞歸函數backtrack,其形參分別是路徑track和選擇列表nums
我們說過此函數內部就是做選擇,遞歸,撤銷選擇循環過程。而做選擇時候就是在遍歷選擇列表,于是我們可以寫成這樣

但是這樣對嗎,肯定是有問題的。前面我們說過,做選擇要求的是做出正確的選擇,而全排列要求數字全部不重復,所在做出選擇之前,我們要進行判斷,要是當前的選擇已經出現過了那么就直接跳過。

最后也是最為重要的,那就是一定要有結束條件,這里結束條件就是選夠三個數字之后就可以結束了,選擇夠三個數字,此時的track就可以作為ret的一項被添加進去了

好的代碼如下,這里還需要強調C++的一個問題呢,那個形參最好搞成引用,不然會引發很大拷貝,空間代價太高了

class Solution { public:vector<vector<int>> ret;//返回vector<vector<int>> permute(vector<int>& nums){vector<int> track;//路徑backtrack(nums,track);//遞歸return ret;}void backtrack(vector<int>& nums,vector<int> track){if(track.size()==nums.size())//達到結束條件,一個全排列生成{ret.push_back(track);//把一種結果添加進去return;}for(int i=0;i<nums.size();i++){vector<int>::iterator it;//找一下nums[i]是否已經有了,有了的話直接接下一個it=find(track.begin(),track.end(),nums[i]);if(it!=track.end())continue;track.push_back(nums[i]);//做出選擇backtrack(nums,track);//遍歷決策樹track.pop_back();//撤銷選擇}} };

總結

以上是生活随笔為你收集整理的回溯算法之全排列问题的全部內容,希望文章能夠幫你解決所遇到的問題。

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