Amber-Leedcode-Java-代码随想录打卡第24-29天

前言

2月2日 这个应该是回溯的专题了,加油鸭

2月7日 基本上完结 - 五天完结回溯 - 有了很大的收获 感恩

理论笔记

77. 组合

听了讲解之后感觉写的比较快了

但是还是有几个

1.需要注意的点

这里因为之前添加进入path的地方还是会改变,因此要创建一个新的变量 

 剪枝操作

最后的类型转换,说实话这里我还没有太搞明白啊,为什么一定要转换过去呢

C老师的解释

好的,让我用一个示例来说明Java不允许将子类的实例直接赋值给父类的引用,以及为什么需要进行类型转换。

假设我们有一个父类Animal和一个子类Dog,如下所示:

class Animal {
    // 父类的成员和方法
}

class Dog extends Animal {
    // 子类的成员和方法
}

现在,我们创建了一个Dog类的实例:

Dog myDog = new Dog();

这里,myDog是一个Dog类的引用,它指向了一个Dog类的实例。

然后,如果我们尝试将myDog赋值给一个Animal类的引用,例如:

Animal myAnimal = myDog;

这时候,编译器会发出一个警告或错误,因为Java不允许直接将子类的实例(Dog)赋值给父类的引用(Animal)。

原因是父类Animal的引用myAnimal可以引用任何Animal的子类的实例,但这并不意味着所有子类都可以直接赋值给它。因为子类可能包含特定于子类的方法和属性,这些方法和属性在父类中可能不存在,因此直接赋值可能导致不一致或错误的行为。

要解决这个问题,如果确实需要将子类的实例赋给父类的引用,可以进行类型转换。例如:

Animal myAnimal = (Animal) myDog;

这里使用了强制类型转换(Animal),以明确告诉编译器我们知道myDog是一个Dog类的实例,但我们将其赋给了一个Animal类的引用。这样做可以编译通过,但需要谨慎使用,因为如果类型转换不正确,可能会导致运行时异常。

2.笔记

1.无减枝

2.减枝

3.Code

class Solution {


    ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
    ArrayList<Integer> path = new ArrayList<>();

    void answer(int n,int k, int start_index){

        if (path.size() == k){
            result.add(new ArrayList<>(path)); // 创建一个新的ArrayList副本并添加到result
            return;
        }
        //剪枝操作
         if (1 + n - start_index + path.size() < k){
                return;
        }
        for (int i = start_index;i <= n;i++ ){
            path.add(i);
            answer(n,k,i+1);
            path.remove(path.size() - 1);
   
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值