前言
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);