39.数字排列
输入一组数字(可能包含重复数字),输出其所有的排列方式。
数据范围:
输入数组长度 [0,6]。
数组元素取值范围 [1,10]。
样例:
输入:[1,2,3]
输出:
[
[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[] vis;
public List<List<Integer>> permutation(int[] nums) {
//当前正在生成的排列
List<Integer>list = new ArrayList<>();
//初始化访问标记数组
vis = new boolean[nums.length];
//排序
Arrays.sort(nums);
//递归搜索
dfs(nums,0,list);
//返回所有排列结果
return res;
}
public void dfs(int[] nums,int n,List<Integer>list){
//终止条件:当前排列长度等于数组长度,说明找到一个完整排列
if(n == nums.length){
//添加到结果集
res.add(new ArrayList<>(list));
return;
}
//遍历所有可能的数字
for(int i = 0;i<nums.length;i++){
//如果当前数字已经被使用,或者遇到重复数字且前一个数字未被使用,则跳过
if(vis[i]||(i>0&&nums[i-1]==nums[i]&&!vis[i-1]))continue;
//选择当前数字
vis[i] = true;
list.add(nums[i]);
//递归进入下一层
dfs(nums,n+1,list);
//回溯,撤销选择
list.remove(list.size()-1);
vis[i] = false;
}
}
}

浙公网安备 33010602011771号