注意结果要求去重,并且有序

所以,首先进行排序,这样可以保证结果有序,以及方便进行使用数组进行去重。

为了获取所有的子集,需要进行获取对数组的遍历过程,则在递归开始,将当前已经遍历的路径,存储进入结果集中。

注意这里的去重,不是单个路径中进行去重,而是避免不同路径的相同位置出现相同的元素。那为了进行同层去重,使用used数组标记当前元素的状态

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return int整型二维数组
     */
    ArrayList<ArrayList<Integer>> res = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();
  	// 进行去重,标记是否已被使用
    int[] used;

    public ArrayList<ArrayList<Integer>> subsets (int[] nums) {
        Arrays.sort(nums);
        used = new int[nums.length];
        getSubSet(nums, 0);
        return res;
    }

    public void getSubSet(int[] nums, int startIndex) {

        res.add(new ArrayList<>(path));

        if (startIndex == nums.length) {
            return;
        }

        for (int i = startIndex; i < nums.length; ++i) {
		  // 如果前一个元素的使用状态为0,说明 当前位置,这个元素已经出现过了。
            if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == 0) {
                continue;
            }
            path.add(nums[i]);
            used[i] = 1;
            getSubSet(nums, i + 1);
            path.removeLast();
            used[i] = 0;
        }
    }
}