Skip to content

Commit 86c39c8

Browse files
update
1 parent 25e6277 commit 86c39c8

12 files changed

Lines changed: 23 additions & 21 deletions

算法/6.滑动窗口相关.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
[toc]
2+
13
# [76. 最小覆盖子串](https://leetcode-cn.com/problems/minimum-window-substring/)
24

35
此题的关键是所有的字符不用连续,所有窗口缩小的条件才是 `count == target.size()`,从此题我们可以总结出滑动窗口相关的代码模板:
Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
使用二分查找**必须是单调有序的数据结构**,一般情况下二分查找造作数据代码简单又高效,但是操作礼物链表这种就有点难了,二分查找具有 O(logn) 的时间复杂度,一般作为体验出现
1+
使用二分查找**必须是单调有序的数据结构**,一般情况下二分查找造作数据代码简单又高效,但是操作礼物链表这种就有点难了,二分查找具有 O(logn) 的时间复杂度,一般作为搜索提出现
22

33
代码模板
44

5-
标准二分,见 leetcode [704. 二分查找](https://leetcode-cn.com/problems/binary-search/) 题目
5+
**标准二分,见 leetcode [704. 二分查找](https://leetcode-cn.com/problems/binary-search/) 题目**
66

77
```java
88
class Solution {
@@ -27,7 +27,11 @@ class Solution {
2727
}
2828
```
2929

30-
2. 寻找右边界
30+
31+
32+
**寻找边界:[34. 在排序数组中查找元素的第一个和最后一个位置](https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/)**
33+
34+
1. 寻找右边界
3135

3236
```java
3337
class Solution {
@@ -55,7 +59,7 @@ class Solution {
5559
}
5660
```
5761

58-
3. 寻找左边界
62+
2. 寻找左边界
5963

6064
```java
6165
class Solution {
Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
33
> 在 Android 下,UI 的布局结构,对标到数据结构中,本质就是一个由 View 和 ViewGroup 组成的多叉树结构。其中 View 只能作为叶子节点...
44
5-
![](https://ask.qcloudimg.com/http-save/yehe-4918971/l3vo6ivz7k.png?imageView2/2/w/1620)
5+
66

77
一. 审题
88
-----
@@ -13,7 +13,7 @@
1313

1414
在 Android 下,UI 的布局结构,对标到数据结构中,本质就是一个由 View 和 ViewGroup 组成的多叉树结构。其中 View 只能作为叶子节点,而 ViewGroup 是可以存在子节点的。
1515

16-
![img](https://ask.qcloudimg.com/http-save/yehe-4918971/bjr5eltscx.png)
16+
![bjr5eltscx](images/bjr5eltscx.png)
1717

1818
上图就是一个典型的 ViewTree 的结构,而想要遍历这个 ViewTree,还需要用到两个 ViewGroup 的方法。
1919

@@ -27,13 +27,11 @@
2727

2828
### 2.1 递归实现
2929

30-
###
31-
32-
![](https://ask.qcloudimg.com/http-save/yehe-4918971/p4d2w4jaop.png)
30+
![p4d2w4jaop](images/p4d2w4jaop-4372882.png)
3331

3432
**当一个大问题,可以被拆分成多个小问题,并且分解后的小问题,和大问题相比,只是数据规模不同,求解思路完全一致的问题,非常适合递归来实现。**
3533

36-
```
34+
```kotlin
3735
fun recursionPrint(root: View) {
3836
printView(root)
3937
if (root is ViewGroup) {
@@ -47,15 +45,15 @@ fun recursionPrint(root: View) {
4745

4846
递归确实可以很清晰的实现功能,但是它有一个致命的问题,当递归深度过深的时候,会爆栈。反应在程序上,就是会抛出 `StackOverflowError`这个异常。
4947

50-
面试的时候,面试者解决问题的思路,使用了递归思想,通常都会很自然的问问 JVM 的栈帧,以及为什么会出现 StackOverflowError 异常。
48+
面试的时候,面试者解决问题的思路,**使用了递归思想,通常都会很自然的问问 JVM 的栈帧,以及为什么会出现 StackOverflowError 异常。**
5149

5250
当然这不是本文的重点,大家了解一下即可。
5351

5452
简单来说,每启动一个线程,JVM 都会为其分配一个 Java 栈,每调用一个方法,都会被封装成一个栈帧,进行**压栈**操作,当方法执行完成之后,又会执行**弹栈**操作。而每个栈帧中,当前调用的方法的一些局部变量、动态连接,以及返回地址等数据。
5553

5654
Java 栈和数据结构的栈结构一样,有两个操作,压栈(入栈)、弹栈(出栈),是一个先入后出(FILO)的结构。这一块的东西,延伸出来就比较多了,你可以简单的理解为调用方法就会压栈,方法执行完会弹栈。
5755

58-
![](https://ask.qcloudimg.com/http-save/yehe-4918971/h10ztydlyk.png)
56+
![h10ztydlyk](images/h10ztydlyk.png)
5957

6058
每次方法的调用,执行压栈的操作,但是每个栈帧,都是要消耗内存的。一旦超过了限制,就会爆掉,抛出 StackOverflowError。
6159

@@ -69,17 +67,17 @@ Java 栈和数据结构的栈结构一样,有两个操作,压栈(入栈)
6967

7068
广度优先的过程,就是对每一层节点依次访问,访问完了再进入下一层。就是**按树的深度,一层层的遍历访问**
7169

72-
![](https://ask.qcloudimg.com/http-save/yehe-4918971/id06rtebmp.png)
70+
![id06rtebmp](images/id06rtebmp.png)
7371

7472
ABCDEFGHI 就是上图这个多叉树,使用广度优先算法的遍历结果。
7573

7674
**广度优先非常适合用先入先出的队列来实现**,每次子 View 都入队尾,而从对头取新的 View 进行处理。
7775

78-
![](https://ask.qcloudimg.com/http-save/yehe-4918971/47589gl30c.png)
76+
![47589gl30c](images/47589gl30c.png)
7977

8078
代码如下:
8179

82-
```
80+
```kotlin
8381
fun breadthFirst(root :View){
8482
val viewDeque = LinkedList<View>()
8583
var view = root
@@ -105,19 +103,19 @@ fun breadthFirst(root :View){
105103

106104
深度优先的过程,就是对每个可能的分支路径,深度到叶子节点,并且每个节点只访问一次。
107105

108-
![](https://ask.qcloudimg.com/http-save/yehe-4918971/s6m19use7k.png)
106+
![s6m19use7k](images/s6m19use7k.png)
109107

110108
ADIHCBGFE 就是上图这个多叉树,使用深度优先算法的遍历结果。
111109

112110
在实现上,**深度优先非常适合用先入后出的栈来实现**。逻辑不复杂,直接上执行时,栈的数据变换。
113111

114-
![](https://ask.qcloudimg.com/http-save/yehe-4918971/uvzzx8usas.png)
112+
![uvzzx8usas](images/uvzzx8usas.png)
115113

116-
![](https://ask.qcloudimg.com/http-save/yehe-4918971/qw4k131pwx.png)
114+
![qw4k131pwx](images/qw4k131pwx.png)
117115

118116
代码实现如下:
119117

120-
```
118+
```kotlin
121119
fun depthFirst(root :View){
122120
val viewDeque = LinkedList<View>()
123121
var view = root
@@ -145,5 +143,3 @@ fun depthFirst(root :View){
145143
其实这道题,还有一些变种,例如统计 ViewGroup 子 View 的数量、分层打印 ViewTree、查找 ID 为 Xxx 的 View 等,有兴趣可以试着写写代码。
146144

147145
算法题就是这样,有一些是考验编码能力,另一些是解决问题的思路,多思考多写,才是正道。
148-
149-
本文参与[腾讯云自媒体分享计划](https://cloud.tencent.com/developer/support-plan),欢迎正在阅读的你也加入,一起分享。

算法/images/47589gl30c.png

32.1 KB
Loading

算法/images/bjr5eltscx.png

10.5 KB
Loading

算法/images/h10ztydlyk.png

15.1 KB
Loading

算法/images/id06rtebmp.png

10.6 KB
Loading
17.3 KB
Loading

算法/images/p4d2w4jaop.png

17.3 KB
Loading

算法/images/qw4k131pwx.png

19 KB
Loading

0 commit comments

Comments
 (0)