没有重复项数字的所有排列及有重复项数字的所有排列

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:

  1. 回溯
  2. 同无重复字符字符串所有的排列一样,只是这个地方最后追加符合条件的结果是,注意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:

  1. 回溯
  2. 注意去重,思想和有重复字符串所有组合排列一样,https://blog.csdn.net/SeaSky_Steven/article/details/114648186

猜你喜欢

转载自blog.csdn.net/SeaSky_Steven/article/details/114766248