下载APP
登录
关闭
讲堂
算法训练营
Python 进阶训练营
企业服务
极客商城
客户端下载
兑换中心
渠道合作
推荐作者
当前播放: 30 | 面试题:生成有效括号组合
00:00 / 00:00
标清
  • 标清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看

算法面试通关40讲

共62讲 · 62课时·约600分钟
18893
免费
01 | 合格程序员的第一步:算法...
免费
02 | 如何事半功倍地学习算法与...
免费
03 | 如何计算算法的复杂度
免费
04 | 如何通过LeetCode来进行算...
免费
05 | 理论讲解:数组&链表
06 | 面试题:反转一个单链表&...
07 | 理论讲解:堆栈&队列
08 | 面试题:判断括号字符串是...
09 | 面试题:用队列实现栈&用...
10 | 理论讲解:优先队列
11 | 面试题:返回数据流中的第...
12 | 面试题:返回滑动窗口中的...
13 | 理论讲解:哈希表
14 | 面试题:有效的字母异位词
15 | 面试题:两数之和
16 | 面试题:三数之和
17 | 理论讲解:树&二叉树&二...
18 | 面试题:验证二叉搜索树
19 | 面试题:二叉树&二叉搜索...
20 | 理论讲解:二叉树遍历
21 | 理论讲解:递归&分治
22 | 面试题:Pow(x,n)
23 | 面试题:求众数
24 | 理论讲解:贪心算法
25 | 面试题:买卖股票的最佳时...
26 | 理论讲解:广度优先搜索
27 | 理论讲解:深度优先搜索
28 | 面试题:二叉树层次遍历
29 | 面试题:二叉树的最大和最...
30 | 面试题:生成有效括号组合
31 | 理论讲解:剪枝
32 | 面试题:N皇后问题
33 | 面试题:数独问题
34 | 理论讲解:二分查找
35 | 面试题:实现一个求解平方...
36 | 理论讲解:字典树
37 | 面试题:实现一个字典树
38 | 面试题:二维网格中的单词...
39 | 理论讲解:位运算
40 | 面试题:统计位1的个数
41 | 面试题:2的幂次方问题&...
42 | 面试题:N皇后问题的另一...
43 | 理论理解:动态规划(上)
44 | 理论理解:动态规划(下)
45 | 面试题:爬楼梯
46 | 面试题:三角形的最小路径...
47 | 面试题:乘积最大子序列
48 | 面试题:股票买卖系列
49 | 面试题:最长上升子序列
50 | 面试题:零钱兑换
51 | 面试题:编辑距离
52 | 理论讲解:并查集
53 | 面试题:岛屿的个数&朋友...
54 | 面试题:岛屿的个数&朋友...
55 | 理论讲解: LRU Cache
56 | 面试题:设计和实现一个LR...
57 | 理论讲解:布隆过滤器
58 | 课程重点回顾
59 | FAQ答疑&面试中切题四件...
60 | 回到起点:斐波拉契数列
61 | 白板实战番外篇:斐波拉契...
62 | 最后的一些经验分享

精选留言(25)

  • 2018-12-03
    递归嵌套递归就会蒙圈,过程好难消化,有没有好的方法理解这个递归过程呢
    1
    3
  • 2018-12-12
    老师能否所有题目有一个java版本的算法解答,题目思路想起来不是很难,难在写出来!
    2
  • 比如两队括号,按理执行完以后生成了(())之后递归结束了,为什么还会进行递归操作?生成后面的()(),这个还是不理解,第一次递归完成不是return ,程序应该返回值了

    作者回复: 还会继续回到上一层递归调用的函数里,把接下来的语句执行完。第一个括号位相当于一层,每层有两个括号的选择。所以肯定后续 ()() 也会被递归到。

    1
    2
  • 2019-03-23
    第三个条件,right<left&&right<n 后面的条件不需要了,因为right<left已经肯定小于n了

    作者回复: 对的,好建议!

    1
  • 2018-11-11
    视频中那个樱桃小丸子写的是Java吧 老师口误说错了??

    作者回复: 是 java 的。

    1
  • 2019-12-02
    越来越觉得递归很有意思,就是有点费🧠
  • 2019-10-27
    我还是理解不了为什么是2个空格缩进……,我们平时工作都是4个

    作者回复: 在公司里肯定要服从公司的决定。只是现在整个行业里越来越多的公司使用2空格。

  • 2019-10-03
    规范不在于到底几个空格,而是是否能做到组织内统一,另外,百度也是四空格,百度算大公司么
  • 这种放和不放的问题应该可以用动态规划解决的吧

    作者回复: 这个题目用 DP 也是可以的。

  • 2019-07-30
    老师,这一讲主要讲回溯?递归?剪枝?
  • 2019-06-28
    在阿里的Java开发手册 一、编程规约(三)代码格式 第5条提到

    【强制】采用4个空格缩进,禁止使用tab字符。
  • 2019-06-25
    递归方案还是比较容易想到的。这里我卡在如何保存这么多string,如何能递归遍历二叉树。
  • 2019-06-25
    递归方案还是比较容易想到的。这里我卡在如何保存这么多string,如何能递归遍历二叉树。
  • 2019-06-20
    把左括号理解成0,右括号理解成1,按照位操作,每一bit上可以是0或者1,所有的组合就是0-2^2N-1的整数,在这个循环里面,写一个循环,通过修改循环变量,跳过无效的组合,也可以达到修剪的效果,
  • 2019-04-04
    学了一点形式语言与自动机,于是就想着用生成的方法来写一个。思路应该和老师说的归纳法类似。

    假设S,T是合法的串,于是有两种生成规则(注意判断长度不能超过n*2):


    1. concat: S + T
    2. expand: '(' + S + ')'

    每轮循环从已有的串中取出串并应用以上两种规则,把生成的新串添加到集合中,直至集合的规模不再增大,算法收敛。

    取出集合中长度为n*2的串作为结果即可。
    提交可以通过,用时200MS+
    这个复杂度不知道怎么分析了。超哥有想法吗?

    ```processing
    public class GenerateParentheses {
        String concat(String s1, String s2) {
            return s1 + s2;
        }
        String expand(String s) {
            return "(" + s + ")";
        }

        HashSet<String> set = new HashSet<>();
        public List<String> generateParenthesis(int n) {
            ArrayList<String> result = new ArrayList<>();
            if (n < 1) return result;
            int cnt = set.size();
            set.add("()");
            while (cnt < set.size()) { // 尚未收敛
                cnt = set.size();
                HashSet<String> frontier = new HashSet<>(); // 此轮新生成的序列
                for (String s1: set) {
                    if (s1.length() < n * 2) frontier.add(expand(s1));
                    for (String s2: set) {
                        if (s1.length() + s2.length() <= n * 2) frontier.add(concat(s1, s2));
                    }
                }
                set.addAll(frontier); // 合并新旧集合。如果有新元素加进来,则会进入下一次循环
            }
            for (String s: set) {
                if (s.length() == n * 2) result.add(s);
            }
            return result;
        }
    }
    ```
    展开

    作者回复: 第一:重复生成的子串比较多;第二,对于由于有重复子串则需要创建和维护一个hashset,且每次进行三判重操作,进一步加大了时间消耗。

  • 2019-03-19
    self.list 这个写法就少输入一个参数了,又可以省下来几个单词,写得更精简了,之前也是没有想过可以这样写。至于其它的,right<left 这种也是很少想过,要努力优化代码啊
  • 2019-03-10
    老师平常写代码的时候用什么编辑器?不同的编辑器使用会不会形成不同的代码风格。比如换行与缩进。怎样才能修炼出一种比较优秀的代码风格。

    作者回复: 最新较为受欢迎的是 vs code

  • 2019-02-18
    覃老师,复杂度用递归树的方法,我觉得是n x 2的2n次方啊。请您帮忙解答下,谢谢!

    作者回复: 2n个盒子里可以放左或者右括号,所以 2^(2n)的复杂度,对吧?

  • 2019-01-08
    被left < right的判断惊艳到, 之前根本就没想到这个条件。
  • 2019-01-06
    关于代码风格的问题,这个不是樱桃小丸子的锅。leetcode或者其他很多ide的默认设置就是遇到循环或者条件的换行自动缩进四空格。

    作者回复: 好的,了解。多谢说明。