比上一个题多了个重复性
与46. 全排列完全一样的代码。。。
class Solution {
    // 当没有下一个排列时return false
    public boolean nextPermutation(int[] nums) {
        if (nums.length == 1) {
            return false;
        }
        int p = -1;
        for (int i = nums.length - 2; i >= 0; i--) {
            if (nums[i] < nums[i + 1]) {
                p = i;
                break;
            }
        }
        if (p != -1) {
            int tmp = nums[p];
            int q = nums.length - 1;
            while (nums[q] <= tmp) {
                q--;
            }
            nums[p] = nums[q];
            nums[q] = tmp;
            reverse(p + 1, nums);
        } else {
//            reverse(0, nums);
            return false;
        }
        return true;
    }
    public void reverse(int k, int[] nums) {
        if (k >= nums.length) return;
        int i = k;
        int j = nums.length - 1;
        while (i < j) {
            int tmp = nums[i];
            nums[i] = nums[j];
            nums[j] = tmp;
            i++;
            j--;
        }
    }
    public List<List<Integer>> permuteUnique(int[] nums) {
        Arrays.sort(nums);
        List<List<Integer>> ans = new ArrayList<>();
        do {
            List<Integer> tmp = new ArrayList<>();
            for (int num : nums) {
                tmp.add(num);
            }
            ans.add(tmp);
        } while (nextPermutation(nums));
        return ans;
    }
}原文:https://www.cnblogs.com/acbingo/p/9350306.html