一 序

本文属于极客时间-算法训练营 学习笔记。

对应章节:极客时间-算法训练营 学习笔记 3递归的实现、特性以及思维要点

二 70Climbing Stairs

You are climbing a stair case. It takes n steps to reach to the top.

Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?

Note: Given n will be a positive integer.

Example 1:

Input: 2
Output: 2
Explanation: There are two ways to climb to the top.
1. 1 step + 1 step
2. 2 steps
Example 2:

Input: 3
Output: 3
Explanation: There are three ways to climb to the top.
1. 1 step + 1 step + 1 step
2. 1 step + 2 steps
3. 2 steps + 1 step
这个题目,覃超老师没有太多展开去讲:

强调了一点,寻找规律。就是利用数学归纳法来找到题目隐藏的斐波那契数列。

f(n)表示爬n阶楼梯的不同方法数,进而分析出:

f(n) = f(n-1)+f(n-2).

三种解法:

只有递归:不过

1)使用递归+缓存。

2)使用数组,来实现动态规划。

3) 直接利用函数公式(前提数学好)

感兴趣的可以看看:https://blog.csdn.net/bohu83/article/details/102528611

三 22. Generate Parentheses

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.

For example, given n = 3, a solution set is:

["((()))","(()())","(())()","()(())","()()()"
]

这个题目,覃超老师亲自示范了解题思路。

我记录下:

1是读题:生成N对匹配括号。列出所有可能。熟悉的同学可以直接跳过了。

切到IDE里面:

先不考虑合法匹配的问题,问题简化成再2*N的长度填充括号。

套用了递归的模板:

public void recur(int level,int param){//递归终结条件if(level>MAX_LEVEL){return;}//处理当前层process(level,param);//下探到下一层recur(level:level+1,newParam);//清理当前层//reverse the current  level status if needed
}————————————————
版权声明:本文为CSDN博主「bohu83」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/bohu83/article/details/107094970

递归函数的参数:当前level,最大层数,当前字符串

public class Code22 {public static void main(String[] args) {Code22 code = new Code22();code.generateParenthesis(3);}public  List<String> generateParenthesis(int n) {generate(0,2*n,"");return null;}public  void generate(int level,int max,String s){//终止if(level>=max){System.out.println(s);return;}// this levelString  s1 = s+"(";String  s2 =s+")";// next levelgenerate(level+1,max,s1);generate(level+1,max,s2);}
}

输出结果:

((((((
((((()
(((()(
(((())
((()((
((()()
((())(
((()))
(()(((
(()(()
(()()(
(()())
(())((
(())()
(()))(
(())))
()((((
()((()
()(()(
()(())
()()((
()()()
()())(
()()))
())(((
())(()
())()(
())())
()))((
()))()
())))(
()))))
)(((((
)(((()
)((()(
)((())
)(()((
)(()()
)(())(
)(()))
)()(((
)()(()
)()()(
)()())
)())((
)())()
)()))(
)())))
))((((
))((()
))(()(
))(())
))()((
))()()
))())(
))()))
)))(((
)))(()
)))()(
)))())
))))((
))))()
)))))(
))))))

再判断括号是否合法 :

  • 左括号不能》n
  • 右括号 左括号个数》右括号的个数

这个两个条件就能覆盖了题目的要求。

因此,修改题目的递归函数,改为左括号数,右括号数、N,

public  List<String> generateParenthesis(int n) {generate(0,0,n,"");return null;}public  void generate(int left,int right,int n,String s){//终止if(left>=n && right>=left){System.out.println(s);return;}// this level// next levelif(left<n) {//左括号能添加generate(left + 1, right,n, s + "(");}if(left>right) {//右括号能添加generate(left ,right+1, n, s + ")");}}

这里输出的就是合法的了:

((()))
(()())
(())()
()(())
()()()

这里对比之前,就发现少了无效的结果,也就是使用逻辑判断提前减去不合法的分支。所谓的”剪枝“。

当然,本地做完了,需要再LeetCode补充完代码,输出结果

所以关键的是:怎么梳理思路写递归。怎么确定参数。

好了,讲完这个例子,超哥有blabla说了一通实际生活中递归的应用,脑洞大开,吧黑客帝国的场景都搬出来了。

有没有道家的一生二,二生三,三生万物的感觉。

最后,强调关注下LeetCode国际站,

先看官方题解,再看most votes. 可以关注下自己的语言: 更容易理解。

养成一种习惯,就是喜欢看别人的代码,要是简洁易懂就好好学习,练会学会。没几行就实现了不是很好懂的,也算提升自己的代码理解能力。怎么着都有好处。

超哥强调的这种悟道、有感觉就是这个意思。简单来说,你知道去哪里学习别人的好代码,也自我培养不断练习学习的习惯,那肯定有收获嘛。

如果不明白,就反复多看几遍视频。

四 98. Validate Binary Search Tree

问题:

Given a binary tree, determine if it is a valid binary search tree (BST).

Assume a BST is defined as follows:

  • The left subtree of a node contains only nodes with keys less than the node's key.
  • The right subtree of a node contains only nodes with keys greater than the node's key.
  • Both the left and right subtrees must also be binary search trees.

Example 1:

    2/ \1   3Input: [2,1,3]
Output: true

Example 2:

    5/ \1   4/ \3   6Input: [5,1,4,null,null,3,6]
Output: false
Explanation: The root node's value is 5 but its right child's value is 4.

问题是校验一颗树是否是二叉搜索树。

条件就是左子树比根节点小,右子树比根节点大。

常规思路会去套用递归。

递归的判断的就是边界。没听超哥讲,做了半小时,各种翻车。

有一个容易陷入的误区就是:之比较左节点右节点,而是要比较整个左子树、右子树。

就是这个常规思路就是参照定义:来确定递归的参数:当前节点以及最小、最大值。

左子树范围就是(min,当前节点val),右子树范围就是(当前节点val,max)

实际做的时候各种边界问题:比如这个

[2147483647]

还是需要反复练习。

覃超老师,后来提到了利用二叉树中序遍历,结果是升序的。来验证。

这个还没做,待补充。

极客时间-算法训练营 3.2相关推荐

  1. 极客时间-算法训练营1.2 实战题目解析:移动零

    一 序 本文属于极客时间-算法训练营 学习笔记系列. 二 刷题步骤 第一遍 五分钟:读题 + 思考 直接看解法:多看几种,比较解法优劣 背诵.默写好的解法 第二遍 马上自己写 --> Leetc ...

  2. 极客时间 算法训练营 毕业总结

    不知不觉8周的算法训练营也接近尾声,这期间训练营对自己的影响有三方面 一方面是收获了刻意练习,终身成长这些可以产生长远影响的思想,这里推荐三本书 卡罗尔·德韦克的<终身成长>.安德斯·艾利 ...

  3. 极客时间-算法训练营-第二周

    文章目录 学习笔记 1.哈希表 定义 图示 具体实现是Map和Set HashSet源码分析 HashMap源码分析 时间复杂度 实战题目 [242. 有效的字母异位词](https://leetco ...

  4. 极客时间 算法训练营 第一周总结

    学习总结 学习内容 课程内容 第三课 数组 链表 跳表 第四课 栈 队列 知识点总结 数组 数组用一块连续的内存空间,来存储相同类型的一组数据. 支持随机访问,时间复杂度 O(1) 插入.删除操作比较 ...

  5. 极客时间算法训练营2019版LeetCode练习题题库

    03课 数组.链表.跳表 两数之和题目 Arrays实战 LeetCode#11 盛最多水的容器 LeetCode#283 移动零 LeetCode#70 爬楼梯 LeetCode#15 三数之和 L ...

  6. 极客大学算法训练营_训练营与大学

    极客大学算法训练营 来自技术招聘公司的数据 对编程训练营进行编程似乎是不可能的. 他们说,与其花四年的大学时间,您可以学习如何成为一个为期三个月的计划的软件工程师. 从表面上看,这听起来更像是特朗普大 ...

  7. 笔记1 第11课 贪心初步 ——柠檬水找零,分发饼干,跳跃游戏,完成所有任务所需最小能量——极客时间算法

    之前收藏了极客时间的算法训练营3期 共21课,计划每一课写博客来记录学习,主要形式为 方法类型1 题1 题解 题2 题解 方法类型2 题1 题解 -- 题目大体来自leetcode 和 acwing ...

  8. 笔记1 第13课 动规2 ——买卖股票最佳时机,打家劫舍,零钱找兑——极客时间算法

    之前收藏了极客时间的算法训练营3期 共21课,计划每一课写博客来记录学习,主要形式为 方法类型1 题1 题解 题2 题解 方法类型2 题1 题解 -- 题目大体来自leetcode 和 acwing ...

  9. 极客时间算法练习题总结

    文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 在极客时间<数据结构和算法之美>最后,王争老师加餐了7天训练内容,对每一部分需要掌握的数据结 ...

  10. 极客大学算法训练营笔记

    一.数据结构和算法总览 1.刻意练习 过遍数:五毒神掌 : 刻意练习自己的弱项 练习基本功很重要 主动式反馈 : 寻求更好的方法和方式:leetcode高手代码 被动式反馈 : code review ...

最新文章

  1. 真实工作经验总结——案例解析企业选型操作步骤
  2. Bminer 7.0.0 ETH挖矿教程(Linux 64)
  3. 有关RDS上只读实例延时分析-同适用于自建MySQL主从延时分析判断
  4. 基于PyGame的乒乓球和滑雪小游戏
  5. 批量修改table和index 的表空间
  6. 如何训练大学生的工程实战能力
  7. java实现单向链表
  8. Spring学习8之静态代理
  9. HTML meta标签总结与属性使用介绍
  10. android第三方应用,Android 第三方应用接入微信平台研究情况分享(一)
  11. vfp 8.0中image控件的属性:RotateFlip
  12. 牛的障碍Cow Steeplechase
  13. 拓客系统专用服务器,北京拓客系统
  14. 阿里云张建锋:数字技术要服务好实体经济
  15. 新手如果写一个软件,应该是怎么一个流程?
  16. 【OFDM】AWGN 信道下 BPSK 调制 (卷积码) 性能对比仿真实验 (Matlab 实现)
  17. 移动手机消息推送机制
  18. 计算机图标右击管理打不开,电脑图标打不开怎么办6
  19. 三维建筑动画的制作流程
  20. ireport的简单使用(数据表格)报表

热门文章

  1. 西门子定时器有几种_【图】西门子step7功能块中定时器的类型与参数
  2. vue3引入echarts
  3. 计算机网络谢希仁课后答案第七版答案完整版
  4. Filter过滤指定ip地址
  5. 怎么将webm格式转换为mp4
  6. php 模拟微信登录,实例详解PHP实现微信模拟登陆并给用户发送消息
  7. html坦克大战js代码包,js实现坦克大战游戏
  8. java笔试涉及编程题
  9. C++题解:百钱买百鸡数量
  10. Audition CC 2019 for Mac中文破解版永久激活方法附破解补丁