[#B] 46 Permutations - LeetCode
Given a collection of distinct integers, return all possible permutations.
Input: [1,2,3] Output: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
排列组合问题,每次从中选一个数,然后再从剩下的选一个,以此类推。我们需要记录哪些数是被用过的,每个数只能被用一次。用完之后要还原,因为下次可能顺序不一样。
class Solution {
List<List<Integer>> res = new ArrayList();
boolean[] used;
public List<List<Integer>> permute(int[] nums) {
if (nums == null || nums.length == 0) return res;
used = new boolean[nums.length];
List<Integer> p = new ArrayList();
generatePermutation(nums, 0, p);
return res;
}
public void generatePermutation(int[] nums, int index, List<Integer> p) {
if (index == nums.length) {
res.add(p);
return;
}
for (int i = 0; i < nums.length; i++) {
if (!used[i]) {
p.add(nums[i]);
used[i] = true;
// 注意这里最后一个参数,这里不应该是个引用传递,不然每次加入后都会被移除,结果就是空了
generatePermutation(nums, index + 1, new ArrayList(p));
p.remove(p.size() - 1);
used[i] = false;
}
}
}
}
class Solution {
public:
vector<vector<int>> res;
vector<bool> used;
vector<vector<int>> permute(vector<int>& nums) {
used = vector<bool>(nums.size(), false);
vector<int> p;
generatePermutations(nums, 0, p);
return res;
}
void generatePermutations(vector<int>& nums, int index, vector<int> p) {
if (index == nums.size()) {
res.push_back(p);
return;
}
for (int i = 0; i < nums.size(); i++) {
if (!used[i]) {
p.push_back(nums[i]);
used[i] = true;
generatePermutations(nums, index + 1, p);
p.pop_back();
used[i] = false;
}
}
}
};
class Solution {
public:
vector<vector<int>> res;
vector<vector<int>> permute(vector<int>& nums) {
vector<int> track;
backTrack(nums, 0, track);
return res;
}
void backTrack(vector<int>& nums, vector<int>& track) {
if (track.size() == nums.size()) {
res.push_back(track);
return;
}
for (int i = 0; i < nums.size(); ++i) {
if (find(track.begin(), track.end(), nums[i]) == track.end()) {
track.push_back(nums[i]);
backTrack(nums, track);
track.pop_back();
}
}
}
};