LeetCode刷题笔记
目录
一.1494.并行课程 II
题目:
不得不说,灵神确实牛啊。看完灵神解析,恍然大悟啊。
首先这道题采用位运算+递归+记忆化搜索。我们先看灵神的解析
灵神解析:
思路整理:
接下来详细解析一下,首先整理一下思路。
1.建立数组,存储每个课程的先行课有哪些。
2.求完成所有课程所需要的最短时间。
第一步:也许很容易想到我们可以用一个二维数组来存储每个课程的先行课,例如bool arr[i][j] 代表第j个课程是否是第i个课程的先行课。是为true,不是为false。很容易想到,但是题目说最多有15个课程,那么很容易想到状态压缩。我们用一个一维数组优化掉二维数组。int类型有32位我们取低位,分别代表一门课程的先行课。例如建立pre1[i]=0000 0000 0000 0000 0000 0000 0000 00101 代表1号课程和3号是i课程的先行课。
第二步:数组有了,接下来考虑怎么得出最短时间。我每次递归从所有学科中选取可以学的学科,也就是先行课学完或者没有先行课的课程。如果小于k就一次性学习所有可以学习的课。如果大于k,遍历所有学k个课程的可能取最小值即可。注意学完要将学完的课变为0,以便下一层递归检测某一课程的先行课是否完成
代码:
二.剑指Offer 05.替换空格
题目:
思路:
首先第一遍遍历,检测有几个空格。然后将该字符串扩容,每有一个空格,字符串长度增加2。然后设置右指针为字符串末尾,左指针为原字符串的末尾。不遇空格不断向前复制即可,遇到空格右指针向前移动并且赋值为“%20”,左指针左移一个跳过空格即可。
代码:
三.剑指 Offer 27.二叉树的镜像
题目:
思路:
根据二叉树镜像的定义,考虑递归遍历(dfs)二叉树,交换每个节点的左 / 右子节点,即可生成二叉树的镜像。
递归解析:
1.终止条件: 当节点 root 为空时(即越过叶节点),则返回 nullptr;
2.递推工作:
(1)初始化节点 tmp ,用于暂存 root 的左子节点;
(2)开启递归 右子节点 mirrorTree(root.right) ,并将返回值作为 root 的 左子节点 。
(3)开启递归 左子节点mirrorTree(tmp) ,并将返回值作为 root 的 右子节点 。
3.返回值: 返回当前节点
代码:
- 点赞
- 收藏
- 关注作者
评论(0)