diff --git a/README.md b/README.md index 5712fbc3..4609858a 100644 --- a/README.md +++ b/README.md @@ -187,6 +187,7 @@ |[0037.解数独](https://github.com/youngyangyang04/leetcode/blob/master/problems/0037.解数独.md) |回溯 |困难| **回溯**| |[0039.组合总和](https://github.com/youngyangyang04/leetcode/blob/master/problems/0039.组合总和.md) |数组/回溯 |中等| **回溯**| |[0040.组合总和II](https://github.com/youngyangyang04/leetcode/blob/master/problems/0040.组合总和II.md) |数组/回溯 |中等| **回溯**| +|[0042.接雨水](https://github.com/youngyangyang04/leetcode/blob/master/problems/0042.接雨水.md) |数组/栈/双指针 |困难| **双指针** **单调栈** **动态规划**| |[0046.全排列](https://github.com/youngyangyang04/leetcode/blob/master/problems/0046.全排列.md) |回溯|中等| **回溯**| |[0047.全排列II](https://github.com/youngyangyang04/leetcode/blob/master/problems/0047.全排列II.md) |回溯|中等| **回溯**| |[0051.N皇后](https://github.com/youngyangyang04/leetcode/blob/master/problems/0051.N皇后.md) |回溯|困难| **回溯**| diff --git a/problems/0042.接雨水.md b/problems/0042.接雨水.md new file mode 100644 index 00000000..349d4102 --- /dev/null +++ b/problems/0042.接雨水.md @@ -0,0 +1,46 @@ +# 题目链接 + +# 思路 +// 只要一个柱子的 +// 暴力的解法 都不好写啊 +// 找左面最大的, 找右边最大的,找左右边际的时候容易迷糊。我已开始还找左大于右的。 (还不够) +// 每次记录单条,不要记录整个面积 + +# C++代码 + +按照列来 +``` +class Solution { +public: + int trap(vector& height) { + int sum = 0; +// for (int i = 0; i < height.size(); i++) { +// cout << height[i] << " "; +// } +// cout << endl; + for (int i = 0; i < height.size(); i++) { + if (i == 0 || i == height.size() - 1) continue; + + int lIndex, rIndex; + int rValue = height[i]; + int lValue = height[i]; + for (int r = i + 1; r < height.size(); r++) { + if (height[r] > rValue) { + rValue = height[r]; + rIndex = r; + } + } + for (int l = i - 1; l >= 0; l--) { + if (height[l] > lValue) { + lValue = height[l]; + lIndex = l; + } + } + int h = min(lValue, rValue) - height[i]; + // 我为啥要算 (rIndex - lIndex + 1);就是按照行 按照列 区分不清啊 + if (h > 0) sum += h; + } + return sum; + } +}; +``` diff --git a/problems/0047.全排列II.md b/problems/0047.全排列II.md index 289c86b6..9cb7c554 100644 --- a/problems/0047.全排列II.md +++ b/problems/0047.全排列II.md @@ -7,21 +7,26 @@ https://leetcode-cn.com/problems/permutations-ii/ 这里就涉及到去重了。 + 要注意**全排列是要取树的子节点的,如果是子集问题,就取树上的所有节点。** 很多同学在去重上想不明白,其实很多题解也没有讲清楚,反正代码是能过的,感觉是那么回事,稀里糊涂的先把题目过了。 这个去重为什么很难理解呢,**所谓去重,其实就是使用过的元素不能重复选取。** 这么一说好像很简单! + 但是什么又是“使用过”,我们把排列问题抽象为树形结构之后,**“使用过”在这个树形结构上是有两个维度的**,一个维度是同一树枝上使用过,一个维度是同一树层上使用过。 + **没有理解这两个层面上的“使用过” 是造成大家没有彻底理解去重的根本原因。** 那么排列问题,既可以在 同一树层上的“使用过”来去重,也可以在同一树枝上的“使用过”来去重! 理解这一本质,很多疑点就迎刃而解了。 -首先把示例中的 [1,1,2],抽象为一棵树,然后在同一树层上对nums[i-1]使用过的话,进行去重如图: +**还要强调的是去重一定要对元素经行排序,这样我们才方便通过相邻的节点来判断是否重复使用了。** + +首先把示例中的 [1,1,2] (为了方便举例,已经排序),抽象为一棵树,然后在同一树层上对nums[i-1]使用过的话,进行去重如图: diff --git a/problems/0090.子集II.md b/problems/0090.子集II.md index ee7a7277..808b37ef 100644 --- a/problems/0090.子集II.md +++ b/problems/0090.子集II.md @@ -32,6 +32,8 @@ https://leetcode-cn.com/problems/subsets-ii/ 所以要明确我们要去重的是同一树层上的“使用过”。 +**还要强调的是去重一定要对元素经行排序,这样我们才方便通过相邻的节点来判断是否重复使用了。** + 用示例中的[1, 2, 2] 来举例,如图所示: diff --git a/problems/二叉树的理论基础.md b/problems/二叉树的理论基础.md new file mode 100644 index 00000000..e3e1bfc1 --- /dev/null +++ b/problems/二叉树的理论基础.md @@ -0,0 +1,35 @@ + +二叉树的基础概念 + +结点的度:一个结点拥有子树的数目称为结点的度 + +满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树 + +满二叉树:深度为k,有2^k-1个节点的二叉树 + +如图: + + +因为在面试中,面试官会说明给出的二叉树,是一科什么样的二叉树,所以大家有必要了解 最基本的二叉树的类型,这样才能和面试官有效沟通。 如果面试官说给出一个完全二叉树,此时候选人不太清楚完全二叉树是什么样的树的话,就会比较麻烦了,如果这种最基础的概念没有弄清,会让面试官对候选人的印象大打折扣。 + +所以基本的概念我们要清楚,这样才能在沟通的过程中 表现出扎实的基本功。 对于二叉树,相信左子树,右子树,父节点,叶子节点,二叉树深度等等这些大家都知道了,我这里单独介绍一下(click) 节点的度:一个结点拥有子树的数目称为结点的度。这个概念在我们介绍二叉树的时候经常用到,一些同学在面试中 描述叶子节点,会说 没有左右孩子的节点,这就显得不够专业, 叶子节点 我们称之为 度为0的节点。 + +那么我们再来介绍几种常见的二叉树类型,(click)什么是满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树, (click)也可以说深度为k,有2^k-1个节点的二叉树 +(click ) 也就是如图所示的树称之为满二叉树。 + + +什么是完全二叉树? + +叶结点只能出现在最底层的两层,且最底层叶结点均处于次底层叶结点的左侧 + + + +那么什么是完全二叉树呢, 很多同学经常把 完全二叉树 和 满二叉树 混在一起。 + +(click)来看一下什么是 完全二叉树,叶结点只能出现在最底层的两层,且最底层叶结点均处于次底层叶结点的左侧。也就是最底层的叶子节点 要从左到右来,中间不能断 ,这么说有点抽象,我们来看图 +例如 +(click) 所以是完全二叉树(click) +(click) 所以也是完全二叉树(click) +(click) 所以不是完全二叉树(click) + +那么满二叉树是不是完全二叉树呢,答案是:这个当然是了 diff --git a/problems/回溯总结.md b/problems/回溯总结.md index d29c9229..a362a988 100644 --- a/problems/回溯总结.md +++ b/problems/回溯总结.md @@ -8,10 +8,15 @@ * 解数独 +* 讲一讲去重为什么要排序。 + + +491. 递增子序列 + # 单层递归 # 双层递归 -# 组合 子集问题,used[i-1] = false 来去重复, 啥问题 used[i-1] = true也是可以的来着 +# 组合 子集问题,used[i-1] = false 来去重复, 啥问题 used[i-1] = true也是可以的来着 排列问题