Skip to content

Commit

Permalink
Update
Browse files Browse the repository at this point in the history
  • Loading branch information
youngyangyang04 committed Nov 25, 2020
1 parent e08fd0e commit fe212cf
Show file tree
Hide file tree
Showing 20 changed files with 284 additions and 91 deletions.
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,10 @@
* [回溯算法:解数独](https://mp.weixin.qq.com/s/eWE9TapVwm77yW9Q81xSZQ)
* [一篇总结带你彻底搞透回溯算法!](https://mp.weixin.qq.com/s/r73thpBnK1tXndFDtlsdCQ)

* 贪心算法
* [关于贪心算法,你该了解这些!](https://mp.weixin.qq.com/s/O935TaoHE9Eexwe_vSbRAg)
* [贪心算法:分发饼干](https://mp.weixin.qq.com/s/YSuLIAYyRGlyxbp9BNC1uw)


(持续更新中....)

Expand Down
Binary file added pics/.DS_Store
Binary file not shown.
Binary file modified pics/222.完全二叉树的节点个数.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added pics/222.完全二叉树的节点个数1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed pics/491. 递增子序列1.jpg
Binary file not shown.
Binary file modified pics/55.跳跃游戏.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed pics/90_子集 II.png
Binary file not shown.
6 changes: 6 additions & 0 deletions problems/0037.解数独.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
> 解数独,理解二维递归是关键
如果对回溯法理论还不清楚的同学,可以先看这个视频[视频来了!!带你学透回溯算法(理论篇)](https://mp.weixin.qq.com/s/wDd5azGIYWjbU0fdua_qBg)

# 37. 解数独

题目地址:https://leetcode-cn.com/problems/sudoku-solver/
Expand Down Expand Up @@ -207,3 +209,7 @@ public:
如果一直跟住「代码随想录」的节奏,你会发现自己进步飞快,从思维方式到刷题习惯,都会有质的飞跃,「代码随想录」绝对值得推荐给身边的同学朋友们!
> **我是[程序员Carl](https://github.com/youngyangyang04),可以找我[组队刷题](https://img-blog.csdnimg.cn/20201115103410182.png),也可以在[B站上找到我](https://space.bilibili.com/525438321),本文[leetcode刷题攻略](https://github.com/youngyangyang04/leetcode-master)已收录,更多[精彩算法文章](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzUxNjY5NTYxNA==&action=getalbum&album_id=1485825793120387074&scene=173#wechat_redirect)尽在公众号:[代码随想录](https://img-blog.csdnimg.cn/20200815195519696.png),关注后就会发现和「代码随想录」相见恨晚!**
**如果感觉对你有帮助,不要吝啬给一个👍吧!**
11 changes: 7 additions & 4 deletions problems/0046.全排列.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@

> 开始排列问题
> 通知:现在已经将所有历史文章,汇总到一起,有一个整体的目录,方便录友们从前面系列开始卡了,就在公众号左下角「算法汇总」,大家去瞅瞅哈
# 46.全排列

Expand Down Expand Up @@ -32,7 +31,7 @@

我以[1,2,3]为例,抽象成树形结构如下:

<img src='../pics/46.全排列.png' width=600> </img></div>
![46.全排列](https://img-blog.csdnimg.cn/20201124200941742.png)

## 回溯三部曲

Expand All @@ -44,7 +43,7 @@

但排列问题需要一个used数组,标记已经选择的元素,如图橘黄色部分所示:

<img src='../pics/46.全排列.png' width=600> </img></div>
![46.全排列](https://img-blog.csdnimg.cn/20201124200941742.png)

代码如下:

Expand All @@ -56,7 +55,7 @@ void backtracking (vector<int>& nums, vector<bool>& used)

* 递归终止条件

<img src='../pics/46.全排列.png' width=600> </img></div>
![46.全排列](https://img-blog.csdnimg.cn/20201124200941742.png)

可以看出叶子节点,就是收割结果的地方。

Expand Down Expand Up @@ -140,3 +139,7 @@ public:

就酱,如果感觉「代码随想录」诚意满满,就帮Carl宣传一波吧!

> **我是[程序员Carl](https://github.com/youngyangyang04),可以找我[组队刷题](https://img-blog.csdnimg.cn/20201115103410182.png),也可以在[B站上找到我](https://space.bilibili.com/525438321),本文[leetcode刷题攻略](https://github.com/youngyangyang04/leetcode-master)已收录,更多[精彩算法文章](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzUxNjY5NTYxNA==&action=getalbum&album_id=1485825793120387074&scene=173#wechat_redirect)尽在公众号:[代码随想录](https://img-blog.csdnimg.cn/20200815195519696.png),关注后就会发现和「代码随想录」相见恨晚!**
**如果感觉对你有帮助,不要吝啬给一个👍吧!**

11 changes: 7 additions & 4 deletions problems/0047.全排列II.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@

> 排列也要去重了
> 通知:很多录友都反馈之前看「算法汇总」的目录要一直往下拉,很麻烦,这次Carl将所有历史文章汇总到一篇文章中,有一个整体的目录,方便录友们从前面系列开始卡了,依然在公众号左下角[「算法汇总」](https://mp.weixin.qq.com/s/weyitJcVHBgFtSc19cbPdw),这里会持续更新,大家快去瞅瞅哈
# 47.全排列 II

Expand Down Expand Up @@ -37,7 +36,7 @@

我以示例中的 [1,1,2]为例 (为了方便举例,已经排序)抽象为一棵树,去重过程如图:

<img src='../pics/47.全排列II1.png' width=600> </img></div>
![47.全排列II1](https://img-blog.csdnimg.cn/20201124201331223.png)

图中我们对同一树层,前一位(也就是nums[i-1])如果使用过,那么就进行去重。

Expand Down Expand Up @@ -114,11 +113,11 @@ if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == true) {

树层上去重(used[i - 1] == false),的树形结构如下:

<img src='../pics/47.全排列II2.png' width=600> </img></div>
![47.全排列II2](https://img-blog.csdnimg.cn/20201124201406192.png)

树枝上去重(used[i - 1] == true)的树型结构如下:

<img src='../pics/47.全排列II3.png' width=600> </img></div>
![47.全排列II3](https://img-blog.csdnimg.cn/20201124201431571.png)

大家应该很清晰的看到,树层上对前一位去重非常彻底,效率很高,树枝上对前一位去重虽然最后可以得到答案,但是做了很多无用搜索。

Expand All @@ -145,3 +144,7 @@ if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == true) {

就酱,很多录友表示和「代码随想录」相见恨晚,那么大家帮忙多多宣传,让更多的同学知道这里,感谢啦!

> **我是[程序员Carl](https://github.com/youngyangyang04),可以找我[组队刷题](https://img-blog.csdnimg.cn/20201115103410182.png),也可以在[B站上找到我](https://space.bilibili.com/525438321),本文[leetcode刷题攻略](https://github.com/youngyangyang04/leetcode-master)已收录,更多[精彩算法文章](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzUxNjY5NTYxNA==&action=getalbum&album_id=1485825793120387074&scene=173#wechat_redirect)尽在公众号:[代码随想录](https://img-blog.csdnimg.cn/20200815195519696.png),关注后就会发现和「代码随想录」相见恨晚!**
**如果感觉对你有帮助,不要吝啬给一个👍吧!**

4 changes: 4 additions & 0 deletions problems/0051.N皇后.md
Original file line number Diff line number Diff line change
Expand Up @@ -228,3 +228,7 @@ public:

就酱,如果感觉「代码随想录」干货满满,就分享给身边的朋友同学吧,他们可能也需要!

> **我是[程序员Carl](https://github.com/youngyangyang04),可以找我[组队刷题](https://img-blog.csdnimg.cn/20201115103410182.png),也可以在[B站上找到我](https://space.bilibili.com/525438321),本文[leetcode刷题攻略](https://github.com/youngyangyang04/leetcode-master)已收录,更多[精彩算法文章](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzUxNjY5NTYxNA==&action=getalbum&album_id=1485825793120387074&scene=173#wechat_redirect)尽在公众号:[代码随想录](https://img-blog.csdnimg.cn/20200815195519696.png),关注后就会发现和「代码随想录」相见恨晚!**
**如果感觉对你有帮助,不要吝啬给一个👍吧!**

43 changes: 36 additions & 7 deletions problems/0055.跳跃游戏.md
Original file line number Diff line number Diff line change
@@ -1,25 +1,49 @@
## 链接
https://leetcode-cn.com/problems/jump-game/

## 思路
# 55. 跳跃游戏

其实贪心和动态规划很容易混在一起,在面试中,我们应该本着能用贪心就用贪心,贪心解决不了再考虑用动态规划。 毕竟贪心更容易理解,并快速写出代码。
给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个位置。

示例 1:
输入: [2,3,1,1,4]
输出: true
解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。

示例 2:
输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。


## 思路

刚看到本题一开始可能想:当前位置元素如果是3,我究竟是跳一步呢,还是两步呢,还是三步呢,究竟跳几步才是最优呢?

其实如果本题是要求只能跳元素数值大小的个数,不能多也不能少,问是否达到终点,那么一定要用动态规划了。
可以转变一下思路,不一样非要明确一次究竟跳几步,每次取最大的跳跃步数,这个就是可以跳跃的覆盖范围。

这个范围内,已经是可以跳过来的,别管是怎么跳的,反正一定可以跳过来。

**那么就是这个跳跃覆盖范围究竟可不可以覆盖到终点!**

每次移动取最大跳跃步数,得到最大的覆盖范围,每移动一个单位,就更新最大覆盖范围。

**局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到就是整体最大覆盖范围,看是否能到终点**

但本题其实我们就看跳到的范围能否覆盖终点,就可以了。

那么我们每次取最大的覆盖范围,看最后能否覆盖终点。

如图:

<img src='../pics/55.跳跃游戏.png' width=600> </img></div>
![55.跳跃游戏](https://img-blog.csdnimg.cn/20201124154758229.png)

那么i每次移动只能在cover的范围内移动,每移动一个元素,cover得到该元素数值的补充,让i继续移动下去。
i每次移动只能在cover的范围内移动,每移动一个元素,cover得到该元素数值(新的覆盖范围)的补充,让i继续移动下去。

而cover每次只取 得到该元素数值补充后的范围 和 cover本身范围 的最大值
而cover每次只取 max(该元素数值补充后的范围, cover本身范围)

如果cover大于等于了终点下表,直接return true就可以了。

Expand All @@ -39,3 +63,8 @@ public:
}
};
```
# 总结



其实贪心和动态规划很容易混在一起,在面试中,我们应该本着能用贪心就用贪心,贪心解决不了再考虑用动态规划。 毕竟贪心更容易理解,并快速写出代码。
13 changes: 8 additions & 5 deletions problems/0090.子集II.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@

用示例中的[1, 2, 2] 来举例,如图所示: (**注意去重需要先对集合排序**

<img src='../pics/90.子集II.png' width=600> </img></div>
![90.子集II](https://img-blog.csdnimg.cn/20201124195411977.png)

从图中可以看出,同一树层上重复取2 就要过滤掉,同一树枝上就可以重复取2,因为同一树枝上元素的集合才是唯一子集!

Expand Down Expand Up @@ -114,16 +114,19 @@ public:

其实这道题目的知识点,我们之前都讲过了,如果之前讲过的子集问题和去重问题都掌握的好,这道题目应该分分钟AC。

当然本题去重的逻辑,也可以这么写

这道题目去重的逻辑,也可以这么写
```
if (i > startIndex && nums[i] == nums[i - 1] ) {
continue;
}
continue;
}
```

**就酱,如果感觉融会贯通了,就把「代码随想录」介绍给自己的同学朋友吧,也许他们也需要!**

> 我是[程序员Carl](https://github.com/youngyangyang04),组队刷题可以找我,本文[leetcode刷题攻略](https://github.com/youngyangyang04/leetcode-master)已收录,更多[精彩算法文章](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzUxNjY5NTYxNA==&action=getalbum&album_id=1485825793120387074&scene=173#wechat_redirect)尽在:[代码随想录](https://img-blog.csdnimg.cn/20200815195519696.png),期待你的关注!
> **我是[程序员Carl](https://github.com/youngyangyang04),可以找我[组队刷题](https://img-blog.csdnimg.cn/20201115103410182.png),也可以在[B站上找到我](https://space.bilibili.com/525438321),本文[leetcode刷题攻略](https://github.com/youngyangyang04/leetcode-master)已收录,更多[精彩算法文章](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzUxNjY5NTYxNA==&action=getalbum&album_id=1485825793120387074&scene=173#wechat_redirect)尽在公众号:[代码随想录](https://img-blog.csdnimg.cn/20201124161234338.png),关注后就会发现和「代码随想录」相见恨晚!**
**如果感觉题解对你有帮助,不要吝啬给一个👍吧!**



89 changes: 67 additions & 22 deletions problems/0222.完全二叉树的节点个数.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
## 题目地址
https://leetcode-cn.com/problems/count-complete-tree-nodes/

> 今天是中秋&&国庆,所以来一道二叉树简单题吧
如果之前两篇[二叉树:看看这些树的最大深度](https://mp.weixin.qq.com/s/guKwV-gSNbA1CcbvkMtHBg)[二叉树:看看这些树的最小深度](https://mp.weixin.qq.com/s/BH8-gPC3_QlqICDg7rGSGA)都认真看了的话,这道题目可以分分钟刷掉了哈哈。

# 222.完全二叉树的节点个数

题目地址:https://leetcode-cn.com/problems/count-complete-tree-nodes/

给出一个完全二叉树,求出该树的节点个数。

示例:
Expand All @@ -15,17 +11,17 @@ https://leetcode-cn.com/problems/count-complete-tree-nodes/

# 思路

这道题目其实没有必要强调是完全二叉树,就是求二叉树节点的个数
本篇给出按照普通二叉树的求法以及利用完全二叉树性质的求法

![image.png](https://pic.leetcode-cn.com/168a07d49c103ada57202f5ad60a2d51f3d0e0ea5c8399e1caed81b709153c85-image.png)
## 普通二叉树

依然可以使用递归法和迭代法来解决
首先按照普通二叉树的逻辑来求

这道题目的递归法和求二叉树的深度写法类似, 而迭代法,[二叉树:层序遍历登场!](https://mp.weixin.qq.com/s/Gb3BjakIKGNpup2jYtTzog)遍历模板稍稍修改一下,记录遍历的节点数量就可以了。

递归遍历的顺序依然是后序(左右中)。

## 递归
### 递归

如果对求二叉树深度还不熟悉的话,看这篇:[二叉树:看看这些树的最大深度](https://mp.weixin.qq.com/s/guKwV-gSNbA1CcbvkMtHBg)

Expand All @@ -49,15 +45,16 @@ if (cur == NULL) return 0;
代码如下:

```
int leftNum = getNodesNum(cur->left); // 左
int rightNum = getNodesNum(cur->right); // 右
int treeNum = leftNum + rightNum + 1; // 中
return treeNum;
int leftNum = getNodesNum(cur->left); // 左
int rightNum = getNodesNum(cur->right); // 右
int treeNum = leftNum + rightNum + 1; // 中
return treeNum;
```

所以整体C++代码如下:

```
// 版本一
class Solution {
private:
int getNodesNum(TreeNode* cur) {
Expand All @@ -76,17 +73,23 @@ public:

代码精简之后C++代码如下:
```
// 版本二
class Solution {
public:
int countNodes(TreeNode* root) {
if (root == NULL) return 0;
return 1 + countNodes(root->left) + countNodes(root->right);
}
};
```

## 迭代法
时间复杂度:O(n)
空间复杂度:O(logn),算上了递归系统栈占用的空间

**网上基本都是这个精简的代码版本,其实不建议大家照着这个来写,代码确实精简,但隐藏了一些内容,连遍历的顺序都看不出来,所以初学者建议学习版本一的代码,稳稳的打基础**


### 迭代法

如果对求二叉树层序遍历还不熟悉的话,看这篇:[二叉树:层序遍历登场!](https://mp.weixin.qq.com/s/Gb3BjakIKGNpup2jYtTzog)

Expand All @@ -113,15 +116,57 @@ public:
}
};
```
时间复杂度:O(n)
空间复杂度:O(n)

## 完全二叉树

以上方法都是按照普通二叉树来做的,对于完全二叉树特性不了解的同学可以看这篇 [关于二叉树,你该了解这些!](https://mp.weixin.qq.com/s/_ymfWYvTNd2GvWvC5HOE4A),这篇详细介绍了各种二叉树的特性。

完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。

# 总结
对于情况一,可以直接用 2^树深度 - 1 来计算,注意这里根节点深度为1。

这道题目的解法其实我们在[二叉树:看看这些树的最大深度](https://mp.weixin.qq.com/s/guKwV-gSNbA1CcbvkMtHBg)[二叉树:看看这些树的最小深度](https://mp.weixin.qq.com/s/BH8-gPC3_QlqICDg7rGSGA)都有提到过了。
对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。

完全二叉树(一)如图:
![222.完全二叉树的节点个数](https://img-blog.csdnimg.cn/20201124092543662.png)

完全二叉树(二)如图:
![222.完全二叉树的节点个数1](https://img-blog.csdnimg.cn/20201124092634138.png)

可以看出如果整个树不是满二叉树,就递归其左右孩子,直到遇到满二叉树为止,用公式计算这个子树(满二叉树)的节点数量。

C++代码如下:

```C++
class Solution {
public:
int countNodes(TreeNode* root) {
if (root == nullptr) return 0;
TreeNode* left = root->left;
TreeNode* right = root->right;
int leftHeight = 0, rightHeight = 0; // 这里初始为0是有目的的,为了下面求指数方便
while (left) { // 求左子树深度
left = left->left;
leftHeight++;
}
while (right) { // 求右子树深度
right = right->right;
rightHeight++;
}
if (leftHeight == rightHeight) {
return (2 << leftHeight) - 1; // 注意(2<<1) 相当于2^2,所以leftHeight初始为0
}
return countNodes(root->left) + countNodes(root->right) + 1;
}
};
```
一样的分析套路,代码也差不多,估计此时大家最这一类求二叉树节点数量以及求深度应该非常熟练了。
时间复杂度:O(logn * logn)
空间复杂度:O(logn)
没有做过这道题目的同学可以愉快的刷了它了。
> **我是[程序员Carl](https://github.com/youngyangyang04),可以找我[组队刷题](https://img-blog.csdnimg.cn/20201115103410182.png),也可以在[B站上找到我](https://space.bilibili.com/525438321),本文[leetcode刷题攻略](https://github.com/youngyangyang04/leetcode-master)已收录,更多[精彩算法文章](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzUxNjY5NTYxNA==&action=getalbum&album_id=1485825793120387074&scene=173#wechat_redirect)尽在公众号:[代码随想录](https://img-blog.csdnimg.cn/20200815195519696.png),关注后就会发现和「代码随想录」相见恨晚!**
最后祝大家中秋&国庆节日愉快哈!
**如果感觉对你有帮助,不要吝啬给一个👍吧!**
> 更多算法干货文章持续更新,可以微信搜索「代码随想录」第一时间围观,关注后,回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等,就可以获得我多年整理的学习资料。
Loading

0 comments on commit fe212cf

Please sign in to comment.