学习目标:
60天训练营打卡计划!
学习内容:
491.递增子序列
- 所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。
所以本题的树层去重逻辑难于前面的集合和组合,因为它要求不改变原数组的顺序。所以需要一个set集合来判断,当前元素是否被使用果。 - 另一方面,本题在存结果时,要判断当前的path的长度。
- 在向path中添加值时,需要判断当前值和path中最后一个值的大小关系。当且仅当大于path中最后一个值时,才存入;否则就跳过该值(continue),判断下一个值。
- **使用HashSet剪枝是一种新的思路,需要记忆。**顺便请记忆一下set的常用api。
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> path = new ArrayList<>();
private void backtracking(int[] nums, int startIndex){
if(path.size() > 1){
res.add(new ArrayList<>(path));
}
Set<Integer> set = new HashSet<>();
for(int i = startIndex; i < nums.length; i++){
if((path.size() > 0 && path.get(path.size()-1) > nums[i]) ||
set.contains(nums[i])) continue;
set.add(nums[i]);
path.add(nums[i]);
backtracking(nums,i+1);
path.remove(path.size()-1);
}
}
public List<List<Integer>> findSubsequences(int[] nums) {
backtracking(nums,0);
return res;
}
}
46.全排列
- 全排列的结束条件是:path长度就等于原数组的长度。
- 此处使用一个used数组来标识变量是否被使用。很好的树层去重的思路。
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> path = new ArrayList<>();
int[] used;
private void backtracking(int[] nums, int[] used){
if(path.size() == nums.length){
res.add(new ArrayList<>(path));
return;
}
for(int i = 0; i < nums.length; i++){
if(used[i] == 1) continue;
used[i] = 1;
path.add(nums[i]);
backtracking(nums, used);
used[i] = 0;
path.remove(path.size() - 1);
}
}
public List<List<Integer>> permute(int[] nums) {
used = new int[nums.length];
backtracking(nums,used);
return res;
}
}
47.全排列 II
- 思路就是46全排列加上组合的树层去重技能。
- 又忘记了树层去重技能,附图:
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> path = new ArrayList<>();
int[] uesd;
private void backtracking(int[] nums, int[] used){
if(path.size() >= nums.length){
res.add(new ArrayList<>(path));
}
for(int i = 0; i < nums.length; i++){
if(used[i] == 1 || (i > 0 && nums[i] == nums[i-1] && used[i-1] == 0)) continue;
used[i] = 1;
path.add(nums[i]);
backtracking(nums,used);
used[i] = 0;
path.remove(path.size() - 1);
}
return;
}
public List<List<Integer>> permuteUnique(int[] nums) {
int[] used = new int[nums.length];
Arrays.sort(nums);
backtracking(nums, used);
return res;
}
}
学习时间: