代码随想录算法训练营第二十四天/理论基础、77、组合

在学习二叉树时,也接触到了“回溯”,回溯和递归是相伴的。


理论基础

~关于回溯的一些内容都是按照自身理解来描述:

我们可以利用二叉树结构来理解,之前我们一直使用的“递归”是从根节点开始,一个个的往下遍历;那么回溯是往上的,要回溯那么就先要递归,可以理解为“原路返回”,至于返回多少就需要按照要求。

常用举例:
1.将符合要求的元素放入集合中,然后回溯的话就是将回溯到的元素在集合里删除;
2.如果是将“递归”到的元素相加的话,那回溯就是要将回溯到的对应元素减去。


77.组合

思路

首先从题目中获取到:n为数据个数,k为单个小集合里元素个数;所以我们结束的条件就是:当小集合的元素个数等于要求的k时,就将小集合分别加入到大集合中,然后结束。
接下来是单层循环的内容,注意:每个数字只能使用一次,不能重复使用,那么我们就会用一个表示位置的:startIndex来协助表示范围,每次当遍历到第i个数字时,那么下一个遍历的就从下一个开始,也就是i+1,所以要注意当题意为不可以重复利用数据时,就要用startIndex来帮助控制范围。
然后将遍历到的当前数据放入小集合中,然后从下一个数据开始递归,之后需要回溯,回溯到另外一条路线的开头然后继续循环以上(运用二叉树理解)。

注意

1.可以将这些数画成二叉树去理解!!!
2.将小集合加入到大集合要注意:new ArrayList<>(小集合),因为每个小集合的内容都不一样,所以需要每个都重新更新。
3.一定要理解startIndex的范围控制,使数据不重复利用的作用。

实现代码

剪枝

class Solution {
    List<List<Integer>> res=new ArrayList<List<Integer>>();
    List<Integer> list=new ArrayList<Integer>();
    public List<List<Integer>> combine(int n, int k) {
        backTracking(n,k,1);
        return res;  
    }
    public void backTracking(int n,int k,int startIndex){
        //判断结束条件
        if(k==list.size()){
            res.add(new ArrayList<>(list));
            return;
        }
        for(int i=startIndex;i<=n-(k-list.size())+1;i++){
            list.add(i);
            backTracking(n,k,i+1);
            list.remove(list.size()-1);
        }
    }
}

总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值