注意结果要求去重,并且有序
所以,首先进行排序,这样可以保证结果有序,以及方便进行使用数组进行去重。
为了获取所有的子集,需要进行获取对数组的遍历过程,则在递归开始,将当前已经遍历的路径,存储进入结果集中。
注意这里的去重,不是单个路径中进行去重,而是避免不同路径的相同位置出现相同的元素。那为了进行同层去重,使用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; } } }