DESC1:
题目描述
给出一组数字,返回该组数字的所有排列
例如:
[1,2,3]的所有排列如下
[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2], [3,2,1].
(以数字在数组中的位置靠前为优先级,按字典序排列输出。)示例1
输入
[1,2,3]
返回值
[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
CODE1:
import java.util.*; public class Solution { public ArrayList<ArrayList<Integer>> permute(int[] num) { ArrayList<ArrayList<Integer>> res = new ArrayList(); if (num == null || num.length == 0) { return res; } Arrays.sort(num); boolean[] visitHis = new boolean[num.length]; backTrack(res, visitHis, new ArrayList<Integer>(), num); return res; } private void backTrack(ArrayList<ArrayList<Integer>> res, boolean[] visitHis, ArrayList<Integer> route, int[] num) { if (route.size() == num.length) { //注意new一个集合,引用数据类型 res.add(new ArrayList<>(route)); return; } for (int i=0; i<num.length; i++) { if (visitHis[i]) { continue; } route.add(num[i]); visitHis[i] = true; backTrack(res, visitHis, route, num); route.remove(route.size()-1); visitHis[i] = false; } } }
NOTES1:
- 回溯
- 同无重复字符字符串所有的排列一样,只是这个地方最后追加符合条件的结果是,注意route变量是引用数据类型,所以需要new一个集合:res.add(new ArrayList<>(route));
DESC2:
题目描述
给出一组可能包含重复项的数字,返回该组数字的所有排列。
示例1
输入
[1,1,2]
返回值
[[1,1,2],[1,2,1],[2,1,1]]
CODE2:
JAVA:
import java.util.*; public class Solution { public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) { ArrayList<ArrayList<Integer>> res = new ArrayList<>(); if (num == null || num.length == 0) { return res; } Arrays.sort(num); boolean[] visitHis = new boolean[num.length]; backTrack(res, num, visitHis, new ArrayList<Integer>()); return res; } private void backTrack(ArrayList<ArrayList<Integer>> res, int[] num, boolean[] visitHis, ArrayList<Integer> current_arr) { if (current_arr.size() == num.length) { res.add(new ArrayList<>(current_arr)); return; } for (int i=0; i<num.length;i++) { if (visitHis[i]) { continue; } //重复项跳过 if (i>0 && num[i]==num[i-1] && !visitHis[i-1]) { continue; } current_arr.add(num[i]); visitHis[i] = true; backTrack(res, num, visitHis, current_arr); current_arr.remove(current_arr.size()-1); visitHis[i] = false; } } }
NOTE2:
- 回溯
- 注意去重,思想和有重复字符串所有组合排列一样,https://blog.csdn.net/SeaSky_Steven/article/details/114648186