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

京公网安备 11010502036488号