递归回溯法(经典解法,易理解) | #求二叉树的层序遍历#

集合的所有子集(一)

http://www.nowcoder.com/practice/c333d551eb6243e0b4d92e37a06fbfc9

回溯法简介:

用于:求解满足调节的全部解,类似于穷举

思想:类似于树的深度遍历,从根节点出发,有活结点与死节点

其他:有"通用解题法"之美誉

参照[回溯算法] 五大常用算法之回溯法

一点提醒: 在刷题过程中,尽量套用模板,在体现一种思路的模板上进行更改,由此可以达到降低思维难度,统一解题风格,降低出错概率的目的! 在

参照[回溯算法] 五大常用算法之回溯法

中, #二. 回溯法实现 - 递归和递推(迭代) ##1. 递归 部分, 给出了统一模板,结合该模板,能快速理解本题!

import java.util.*;

public class Solution {
        /**
     * 该递归函数完成后,result中是: 在 arr 中 选择k个数字的全部组合(无重复)。
     * @param k     选择k个数字的组合
     * @param start 从数组的 start位置 开始
     * @param list  一个组合
     * @param arr   原数组
     * 第一次接触回溯法,羞耻参考大佬题解:NC27 集合的所有子集(一) (回溯) @小灰灰QAQ
     * 答题来看,题解遵循https://blog.csdn.net/weiyuefei/article/details/79316653
     *"二. 回溯法实现 - 递归和递推(迭代)     1. 递归"中的模板,看完该文章后,能更好理解!
     */
    ArrayList<ArrayList<Integer>> result = new ArrayList<>();
    int[] S1;
    public ArrayList<ArrayList<Integer>> subsets(int[] S) {
        S1=S;
        for(int i=0;i<=S.length;i++){
            backTracing(i,0,new ArrayList<>());
        }
        return result;
    }
    public void backTracing(int k, int start, List<Integer> list) {
        if(k==0){
            result.add(new ArrayList(list));
        }else{
                for (int i = start; i < S1.length; i++) {
                list.add(S1[i]);
                //上一行代码选择了一个数字 , 接着对于剩余数字 做组合。 k-1 表示接下来少选一个数,i+1表示 从数组的i+1开始
                backTracing(k - 1, i + 1, list);
                // 去掉 arr[i] , 下一轮循环跳过这个数。 数组内每一个元素 都有两种状态:选或者不选。
                list.remove(list.size() - 1);
            }
        }
    }

 
}

时间复杂度:2^n 空间复杂度:2^n (看着唬人,可是这题目时空复杂度确实必须这样,由运行结果可知,该解法还是较优的)

运行结果: alt

全部评论

相关推荐

不愿透露姓名的神秘牛友
06-25 17:22
点赞 评论 收藏
分享
感觉他们一点都不了解现在这个社会就业有多难,已经在牛客刷到好多篇&nbsp;延毕的帖子了,延毕就会导致已经找好的工作就没了,还得重新再找,学校和老师们是怎么想的呢????看到学生丢失工作会开心吗&nbsp;就业数据都在造假,真实的就业困难不去解决&nbsp;一个个真是好样的
从今天开始狠狠卷JV...:学生看到的是导师不放实习导致offer黄了。 导师看到的是招进来的学生吃自己补助和自己的招生名额,却没给自己升迁带来任何帮助,还要跑路。 根本利益的不一致,最主要留校的导师大概率是职场上招聘失败的,被迫留校的,什么牛鬼蛇神都会有
点赞 评论 收藏
分享
06-11 13:34
门头沟学院 C++
offe从四面八方来:我真的没时间陪你闹了
点赞 评论 收藏
分享
Southyeung:我说一下我的看法(有冒犯实属抱歉):(1)简历不太美观,给我一种看都不想看的感觉,感觉字体还是排版问题;(2)numpy就一个基础包,机器学习算法是什么鬼?我感觉你把svm那些写上去都要好一点。(2)课程不要写,没人看,换成获奖经历;(3)项目太少了,至少2-3个,是在不行把网上学习的也写上去。
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务