解題思路:
? ? ? ? 1.獲取信息:
? ? ? ? ? ? ? ? 給定一個不含重復數字的數組,返回所有可能的全排列,可以按任意順序返回
? ? ? ? ? ? ? ? 提示信息:1 <= nums.length <= 6
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??-10 <= nums[i] <= 10
? ? ? ? 2.分析題目:
? ? ? ? ? ? ? ? 要獲取到所有可能的全排列
? ? ? ? ? ? ? ? 我們每次會從數組中取出一個數來作為一種排列的成員,直到取出過所有的數,那么就形成了一種排列
? ? ? ? ? ? ? ? 而取下一個數又要依據前面取的數,防止取到相同的數,造成重復
? ? ? ? ? ? ? ? 所以實際上的過程就是如下,以nums= [1,2,3]為例
? ? ? ? ? ? ? ? 第一次取數:
? ? ? ? ? ? ? ? res=[ [1], [2], [3] ]
? ? ? ? ? ? ? ? 第二次取數要依據前面取的數來取,我們就依次取出res中的元素:
? ? ? ? ? ? ? ? [1]:
? ? ? ? ? ? ? ? [1, 2],[1, 3]
? ? ? ? ? ? ? ? [2]:
? ? ? ? ? ? ? ? [2, 1],[2, 3]
? ? ? ? ? ? ? ? [3]:
? ? ? ? ? ? ? ? [3, 1],[3, 2]
? ? ? ? ? ? ? ? 第三次取數:
? ? ? ? ? ? ? ? [1, 2]:
? ? ? ? ? ? ? ? 等等,依次類推,我就不寫完了,差不多看到這里應該就懂得我的思路了
? ? ? ? 3.示例查驗:
? ? ? ? ? ? ? ? 示例1:可以用來檢驗思路是否正確
? ? ? ? 4.嘗試編寫代碼:
? ? ? ? ? ? ? ? (1)暴力法:(我覺得我的方法挺暴力的,所以就取了這個名字)
? ? ? ? ? ? ? ? ? ? ? ? 思路:跟上面所說的思路基本一致,只不過我加入了防止取到重復的數的步驟,并且使用了遞歸
? ? ? ? ? ? ? ? ? ? ? ? 防止取到重復的數的步驟,思路來源于提示信息,我們知道每個數的范圍在一個較小的范圍,我們就可以用數組來模擬哈希表進行查重的操作,具體可以看下面代碼
class Solution {
public:vector<vector<int>> permute(vector<int>& nums) {vector<vector<int>>res;//儲存結果vector<bool>tab(21,true);//查重操作vector<int>path;//每一種排列GetRes(res,tab,nums,path);//遞歸return res;//返回結果}
private:void GetRes(vector<vector<int>>&res,vector<bool>&tab,vector<int>&nums,vector<int>&path){if(path.size()==nums.size()){//如果一種排列中的元素的數目等于數組中元素的數目res.push_back(path);return;}for(int i=0;i<nums.size();i++){if(tab[nums[i]+10]){//如果該元素不存在這種排列中path.push_back(nums[i]);tab[nums[i]+10]=false;GetRes(res,tab,nums,path);path.pop_back();tab[nums[i]+10]=true;}}}
};
今天的題解也完成了,就這樣吧