給出一個具備重複數字的列表,找出列表全部不一樣的排列。code
#### 樣例
給出列表 [1,2,2],不一樣的排列有:
[
[1,2,2],
[2,1,2],
[2,2,1]
]遞歸挑戰
使用遞歸和非遞歸分別完成該題。get
標籤
領英 遞歸 深度優先搜索it
class Solution { public: /** * @param nums: A list of integers. * @return: A list of permutations. */ vector<vector<int> > permute(vector<int> nums) { // write your code here vector<vector<int> > result; int size = nums.size(); if(size == 0) { result.push_back(nums); return result; } permute(nums, 0, size, result); return result; } void permute(vector<int> &nums, int begin, int end, vector<vector<int> > &result) { if(begin == end) { if(!isExist(nums, result)) { result.push_back(nums); } } else { for(int i=begin; i<end; i++) { int temp = nums[i]; nums[i] = nums[begin]; nums[begin] = temp; permute(nums, begin+1, end, result); temp = nums[i]; nums[i] = nums[begin]; nums[begin] = temp; } } } bool isExist(vector<int> &nums, vector<vector<int> > &result) { int size = result.size(); if(size == 0) return false; for(int i=0; i<size; i++) { if(isSameNums(nums, result[i])) { return true; } } return false; } bool isSameNums(vector<int> &nums1, vector<int> &nums2) { int size = nums1.size(); for(int i=0; i<size; i++) { if(nums1[i] != nums2[i]) { return false; } } return true; } };