p11 无重复元素的数组全排列 (leetcode46)
一:解题思路
这道题目回溯的思想来做,代码表现的方式为递归。Time:O(n*n!),Space:O(n)
二:完整代码示例
C++版:
class Solution { public: void permuteRec(vector<int>& nums, int start, vector<vector<int>>& result) { if (start == nums.size()) { result.push_back(nums); } else { for (int i = start; i < nums.size(); i++) { swap(nums[start],nums[i]); permuteRec(nums,start+1,result); swap(nums[start],nums[i]); } } } vector<vector<int>> permute(vector<int>& nums) { vector<vector<int>> result; if (nums.size() == 0) return result; permuteRec(nums,0,result); return result; } };
Java版:
class Solution { private void permuteRec(List<Integer> nums,int start,List<List<Integer>> result) { if(start==nums.size()) { result.add(new ArrayList<>(nums)); } else { for(int i=start;i<nums.size();i++) { Collections.swap(nums,i,start); permuteRec(nums,start+1,result); Collections.swap(nums,i,start); } } } public List<List<Integer>> permute(int[] nums) { if(nums==null||nums.length==0) return new ArrayList<>(); List<List<Integer>> result=new ArrayList<>(); List<Integer> list=new ArrayList<>(); for(int num:nums) list.add(num); permuteRec(list,0,result); return result; } }
把这个题目稍微改编一下,把题目中的重复数字这个条件给去掉(数组中可能存在重复的数字),求所有可能不重复的情况?代码如下:
class Solution { public: void permuteRec(vector<int>& nums, int start, vector<vector<int>>& result) { if (start == nums.size()) { result.push_back(nums); } else { for (int i = start; i < nums.size(); i++) { if (nums[i] != nums[start] || i==start) { swap(nums[start], nums[i]); permuteRec(nums, start + 1, result); swap(nums[start], nums[i]); } } } } vector<vector<int>> permute(vector<int>& nums) { vector<vector<int>> result; if (nums.size() == 0) return result; permuteRec(nums,0,result); return result; } }; int main() { Solution s; vector<int> v = {1,1,3}; vector<vector<int>> ret; ret=s.permute(v); int m = ret.size(); int n = ret[0].size(); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { cout << ret[i][j] << " "; } cout << endl; } return 0; }
上述解法实际上是有问题的,来看下面这种解法,运用一个set。
leetcode 47 题。
class Solution { private: void permute(vector<int>& nums, int start, set<vector<int>>& result) { if (start == nums.size()) { result.insert(nums); } else { for (int i = start; i < nums.size(); i++) { //if ((nums[i] != nums[start]) || (i==start)) { swap(nums[start], nums[i]); permute(nums, start + 1, result); swap(nums[start], nums[i]); } } } } public: vector<vector<int>> permuteUnique(vector<int>& nums) { set<vector<int>> result; vector<vector<int>> ret; if (nums.size() == 0) return ret; permute(nums,0,result); set<vector<int>>::iterator it; for (it = result.begin(); it != result.end(); it++) { ret.push_back(*it); } return ret; } };

浙公网安备 33010602011771号