LeetCode--46.全排列
解题思路:
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;}}}
};
今天的题解也完成了,就这样吧