力扣77题,第24天打卡

今天开启了新的一个部分,就是回溯算法,这边老师给到的一个回溯三部曲

void backTracking (arg..[]){

        if(end condition){

                collect result;

                return;        

        }

        for(element in array){

        propsoe element;

        递归

        回溯

        }

        return;

}

以后遇到涉及回溯的所有题目均可使用这个模板

77题:组合,一开始我没有明白为什么这么做,看了视频后写的,首先关键点在于确定要传入的参数,这里有个关键是startIndex,这个可以让下一层递归得到起始位置,很关键。还有就是剪枝的操作,当顺序遍历到一个数的后边所有数的数量不足以完成k的目标时进行剪枝操作

代码如下:

(未剪枝版)

    List> re = new ArrayList();
    List path = new ArrayList();
    public List> combine(int n, int k) {
        
        backTracking(n,k,1);
        return re;

    }

    public void backTracking(int n,int k,int startNum){
        if(path.size()==k){
            re.add(new ArrayList<>(path));
            return;
        }
        for(int i=startNum;i<=n;i++){
            path.add(i);
            backTracking(n,k,i+1);
            path.remove(path.size()-1);
        }
    }

(剪枝版):

   List> re = new ArrayList();
    List path = new ArrayList();
    public List> combine(int n, int k) {
        
        backTracking(n,k,1);
        return re;

    }

    public void backTracking(int n,int k,int startNum){
        if(path.size()==k){
            re.add(new ArrayList<>(path));
            return;
        }
        for(int i=startNum;i<=n-(k-path.size())+1;i++){
            path.add(i);
            backTracking(n,k,i+1);
            path.remove(path.size()-1);
        }
    }

你可能感兴趣的:(leetcode,算法,数据结构)