给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
成功
执行用时 : 5 ms, 在Permutations的Java提交中击败了58.59% 的用户
内存消耗 : 38.1 MB, 在Permutations的Java提交中击败了80.48% 的用户
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer> > res = new ArrayList<List<Integer> >();
if(nums.length == 0)
return res;
List<Integer> tmp = new ArrayList<Integer>();
boolean[] visited = new boolean[nums.length];
helper(nums, res, visited, tmp);
return res;
}
public void helper(int[] nums, List<List<Integer> > res, boolean[] v, List<Integer> tmp){
if(tmp.size() == nums.length){
res.add(new ArrayList<Integer>(tmp) );
return;
}
for(int i=0; i<nums.length; i++){
if(v[i])
continue;
v[i] = true;
tmp.add(nums[i] );
helper(nums, res, v, tmp);
v[i] = false;
tmp.remove(tmp.size()-1);
}
}
}
还有一种交换的算法 我没没推明白。
全排列II
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ]
成功
执行用时 : 6 ms, 在Permutations II的Java提交中击败了73.79% 的用户
内存消耗 : 41.7 MB, 在Permutations II的Java提交中击败了85.57% 的用户
class Solution {
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> res = new ArrayList<List<Integer> >();
if (nums.length == 0)
return res;
boolean[] visited = new boolean[nums.length];
List<Integer> tmp = new ArrayList<Integer>();
Arrays.sort(nums);
helper(nums, res, visited, tmp);
return res;
}
public void helper(int[] nums, List<List<Integer>> res, boolean[] v, List<Integer> tmp){
if(nums.length == tmp.size() ){
res.add(new ArrayList<Integer>(tmp) );
return;
}
for(int i=0; i<nums.length; i++){
if(v[i])
continue;
v[i] = true;
tmp.add(nums[i] );
helper(nums, res, v, tmp);
v[i] = false;
tmp.remove(tmp.size()-1 );
while(i+1<nums.length && nums[i] == nums[i+1]){
// 输入
// [1,1,2]
// 输出
// [[1,1,2],[1,2,1]]
// 预期结果
// [[1,1,2],[1,2,1],[2,1,1]]
i++;
//v[i] = true;
}
}
}
}
相似题目: