排列,含重复元素和不重复元素两种情况的实现

来源:互联网 发布:链家端口费是每个月吗? 编辑:程序博客网 时间:2024/04/29 16:56

用的典型的回溯法:

    public List<List<Integer>> permute(int[] nums) {        List<List<Integer>> result = new ArrayList<>();        permute(result, nums, 0);        return result;    }    private void permute(List<List<Integer>> result, int[] nums, int idx) {        if (idx == nums.length) {            ArrayList<Integer> arrayList = new ArrayList<>();            for (int num : nums) {                arrayList.add(num);            }            result.add(arrayList);        }        for (int i = idx; i < nums.length; i++) {            swap(nums, idx, i);            permute(result, nums, idx + 1);            swap(nums, idx, i);        }    }    private void swap(int[] nums, int i, int j) {        int tmp = nums[i];        nums[i] = nums[j];        nums[j] = tmp;    }    public List<List<Integer>> permuteUnique(int[] nums) {        List<List<Integer>> result = new ArrayList<>();        permuteUnique(result, nums, 0);        return result;    }    private void permuteUnique(List<List<Integer>> result, int[] nums, int idx) {        if (idx == nums.length) {            ArrayList<Integer> arrayList = new ArrayList<>();            for (int num : nums) {                arrayList.add(num);            }            result.add(arrayList);        }        for (int i = idx; i < nums.length; i++) {            if (!isDuplicate(nums, idx, i)) {                swap(nums, idx, i);                permuteUnique(result, nums, idx + 1);                swap(nums, idx, i);            }        }    }    private boolean isDuplicate(int[] nums, int idx, int i) {        for (int i1 = idx; i1 < i; i1++) {            if (nums[i1] == nums[i]) {                return true;            }        }        return false;    }


0 0
原创粉丝点击