第七章 回溯算法part05
大纲
leetcode 491
递增子序列
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> item = new ArrayList<>();
public List<List<Integer>> findSubsequences(int[] nums) {
backtrack(nums, 0);
return res;
}
private void backtrack(int[] nums, int index) {
if (item.size() > 1) res.add(new ArrayList<>(item));
Set<Integer> set = new HashSet<>();
for (int i = index; i < nums.length; i++) {
if (!item.isEmpty() && item.get(item.size() - 1) > nums[i]) continue;
if (set.contains(nums[i])) continue;
set.add(nums[i]);
item.add(nums[i]);
backtrack(nums, i + 1);
item.remove(item.size() - 1);
}
}
}
leetcode 46
全排列
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> item = new ArrayList<>();
public List<List<Integer>> permute(int[] nums) {
backtrack(nums);
return res;
}
private void backtrack(int[] nums) {
if (item.size() == nums.length) {
res.add(new ArrayList<>(item));
return;
}
for (int i = 0; i < nums.length; i++) {
if (item.contains(nums[i])) continue;
item.add(nums[i]);
backtrack(nums);
item.remove(item.size() - 1);
}
}
}
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> item = new ArrayList<>();
boolean[] used;
public List<List<Integer>> permuteUnique(int[] nums) {
Arrays.sort(nums);
used = new boolean[nums.length];
Arrays.fill(used, false);
backtrack(nums);
return res;
}
private void backtrack(int[] nums) {
if (nums.length == item.size()) {
res.add(new ArrayList<>(item));
return;
}
for (int i = 0; i < nums.length; i++) {
if (used[i]) continue;
if (i > 0 && nums[i] == nums[i - 1] && used[i - 1]) continue;
used[i] = true;
item.add(nums[i]);
backtrack(nums);
item.remove(item.size() - 1);
used[i] = false;
}
}
}