提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
Leetcode
491. 递增子序列
● 今日学习的Leetcode链接
● 自己看到题目的第一想法
- 不能排序,而且要树层去重
- 要保证时子集合的递增关系(从左往右)
● 看完代码随想录之后的想法
六
● 自己实现过程中遇到哪些困难
- 怎样保证树层剪枝 在方法中,for循环前加new HashSet(),这样就是记录横向的树层上的元素。跳过是因为在前边的相同元素时,已经把本元素之后,包括本元素,都收集过了
- 两个continue条件分开写
● 今日收获,记录一下自己的学习时长
长
class Solution {
List<List<Integer>> result = new ArrayList<>();
Deque<Integer> list = new LinkedList<>();
public List<List<Integer>> findSubsequences(int[] nums) {
if(nums.length==1||nums.length==0){
return result;
}
find(nums,0);
return result;
}
public void find(int[] nums,int start){
if(start==nums.length){
return;
}
Set<Integer> set = new HashSet<>();
for(int i=start;i<nums.length;i++){
if(set.contains(nums[i])){
continue;
}
if(list.size()!=0&&nums[i]<list.getLast()){
continue;
}
list.add(nums[i]);
if(list.size()>1){
result.add(new ArrayList<>(list));
}
set.add(nums[i]);
find(nums,i+1);
list.removeLast();
}
}
}
46. 全排列
● 今日学习的Leetcode链接
● 自己看到题目的第一想法
和前边的类似(错误)
本题前提:没有重复元素
● 看完代码随想录之后的想法
- 要用used数组,记录有没有用过
- 不用担心总是从1开始取,因为在for循环时,其余的数字都有相同的概率被选中,只是在搜集过程中有先后。相当于先搜集1开始的,再搜集2开始的,但是搜集的结果中总是会有1开始和2开始的数列。
● 自己实现过程中遇到哪些困难
全排列不用start,而是用used[]
● 今日收获,记录一下自己的学习时长
补
class Solution {
List<List<Integer>> result = new ArrayList<>();
Deque<Integer> list = new LinkedList<>();
public List<List<Integer>> permute(int[] nums) {
if(nums.length==0){
return result;
}
boolean[] used = new boolean[nums.length];
Arrays.fill(used,false);
perm(nums,used);
return result;
}
public void perm(int[] nums,boolean[] used){
if(nums.length==list.size()){
result.add(new ArrayList<>(list));
}
for(int i=0;i<nums.length;i++){
if(used[i]==true){
continue;
}
used[i] = true;
list.add(nums[i]);
perm(nums,used);
used[i] = false;
list.removeLast();
}
}
}
47. 全排列 II
● 今日学习的Leetcode链接
● 自己看到题目的第一想法
有重复元素
● 看完代码随想录之后的想法
如果改成 used[i - 1] == true, 也是正确的,排列也可以用树枝去重
● 自己实现过程中遇到哪些困难
无
● 今日收获,记录一下自己的学习时长
补
class Solution {
List<List<Integer>> result = new ArrayList<>();
Deque<Integer> list = new LinkedList<>();
public List<List<Integer>> permuteUnique(int[] nums) {
if(nums.length==0){
return result;
}
boolean[] used = new boolean[nums.length];
Arrays.fill(used,false);
Arrays.sort(nums);
permute(nums,used);
return result;
}
public void permute(int[] nums,boolean[] used){
if(nums.length==list.size()){
result.add(new ArrayList<>(list));
}
for(int i=0;i<nums.length;i++){
if(used[i]==true){
continue;
}
if(i!=0&&nums[i]==nums[i-1]&&used[i-1]==false){
continue;
}
used[i] = true;
list.add(nums[i]);
permute(nums,used);
used[i] = false;
list.removeLast();
}
}
}