Leetcode 46. 全排列 491. 递增子序列 47. 全排列 II

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


491. 递增子序列


● 今日学习的Leetcode链接

递增子序列

● 自己看到题目的第一想法

  1. 不能排序,而且要树层去重
  2. 要保证时子集合的递增关系(从左往右)

● 看完代码随想录之后的想法

● 自己实现过程中遇到哪些困难

  1. 怎样保证树层剪枝 在方法中,for循环前加new HashSet(),这样就是记录横向的树层上的元素。跳过是因为在前边的相同元素时,已经把本元素之后,包括本元素,都收集过了
  2. 两个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链接

全排列

● 自己看到题目的第一想法

和前边的类似(错误)
本题前提:没有重复元素

● 看完代码随想录之后的想法

  1. 要用used数组,记录有没有用过
  2. 不用担心总是从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链接

全排列 II

● 自己看到题目的第一想法

有重复元素

● 看完代码随想录之后的想法

如果改成 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();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值