【LeetCode】96. Permutations
阿新 • • 發佈:2018-12-14
題目描述(Medium)
Given a collection of distinct integers, return all possible permutations.
題目連結
Example 1:
Input: [1,2,3] Output: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
演算法分析
方法一:dfs解法,每次從左到右,選一個沒有出現過的元素,當走到最後一個元素時則返回。時間複雜度,空間複雜度。
方法二:自己實現next_permutation(),詳見【LeetCode】12.Next Permutation
,時間複雜度,空間複雜度。
提交程式碼(方法一):
class Solution { public: vector<vector<int>> subsetsWithDup(vector<int>& nums) { sort(nums.begin(), nums.end()); vector<int> path; vector<vector<int>> result; dfs(nums, path, 0, result); return result; } void dfs(vector<int>& nums, vector<int>& path, int step, vector<vector<int>> &result) { if (step == nums.size()) { result.push_back(path); return; } int firstSame = step; while (firstSame >= 0 && nums[step] == nums[firstSame]) --firstSame; int sameNum = step - firstSame - 1; if (sameNum == 0 || (path.size() >= sameNum && path[path.size()- sameNum] == nums[step])) { // 考慮S[i] path.push_back(nums[step]); dfs(nums, path, step + 1, result); path.pop_back(); } // 不考慮S[i] dfs(nums, path, step + 1, result); } };
提交程式碼(方法二):
class Solution { public: vector<vector<int>> permute(vector<int>& nums) { vector<vector<int>> result; sort(nums.begin(), nums.end()); do { result.push_back(nums); } while(next_permutations(nums)); return result; } bool next_permutations(vector<int>& nums) { auto rfirst = nums.rbegin(); auto rlast = nums.rend(); auto pivot = rfirst + 1; while (pivot != rlast && *pivot > *(pivot - 1)) ++pivot; if (pivot == rlast) return false; auto onchange = find_if(rfirst, pivot, bind1st(less<int>(), *pivot)); swap(*pivot, *onchange); reverse(rfirst, pivot); return true; } };