89.格雷编码(多种方法)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/00631dcd2f0507f933d6558f712a5354.png)
class Solution {
public List<Integer> grayCode(int n) {
List<Integer> res = new ArrayList<>();
res.add(0);
int head = 1;
for(int i = 0; i < n; i++) {
for(int j = res.size() - 1; j >= 0; j--) {
res.add(head + res.get(j));
}
head <<= 1;
}
return res;
List<Integer> gray = new ArrayList<Integer>();
gray.add(0);
for (int i = 1; i < 1 << n; i++) {
int previous = gray.get(i - 1);
if (i % 2 == 1) {
previous ^= 1;
gray.add(previous);
} else {
int temp = previous;
for (int j = 0; j < n; j++) {
if ((temp & 1) == 1) {
previous = previous ^ (1 << (j + 1));
gray.add(previous);
break;
}
temp = temp >> 1;
}
}
}
return gray;
}
}
90.子集2(DFS+去重)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/248421ab19ce8ef7998ab7b2a72293b7.png)
class Solution {
public List<List<Integer>> subsetsWithDup(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
if(nums.length < 1) return res;
Deque<Integer> path = new ArrayDeque<>();
Arrays.sort(nums);
dfs(nums, 0, path, res);
return res;
}
public void dfs(int[] nums, int start, Deque<Integer> path, List<List<Integer>> res) {
res.add(new ArrayList<>(path));
for(int i = start; i < nums.length; i++) {
if(i > start && nums[i] == nums[i - 1]) continue;
path.addLast(nums[i]);
dfs(nums, i + 1, path, res);
path.removeLast();
}
}
}