mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-09 03:34:02 +08:00
update 0239.滑动窗口最大值: 修改错字
This commit is contained in:
@ -38,7 +38,7 @@
|
|||||||
|
|
||||||
难点是如何求一个区间里的最大值呢? (这好像是废话),暴力一下不就得了。
|
难点是如何求一个区间里的最大值呢? (这好像是废话),暴力一下不就得了。
|
||||||
|
|
||||||
暴力方法,遍历一遍的过程中每次从窗口中在找到最大的数值,这样很明显是O(n × k)的算法。
|
暴力方法,遍历一遍的过程中每次从窗口中再找到最大的数值,这样很明显是O(n × k)的算法。
|
||||||
|
|
||||||
有的同学可能会想用一个大顶堆(优先级队列)来存放这个窗口里的k个数字,这样就可以知道最大的最大值是多少了, **但是问题是这个窗口是移动的,而大顶堆每次只能弹出最大值,我们无法移除其他数值,这样就造成大顶堆维护的不是滑动窗口里面的数值了。所以不能用大顶堆。**
|
有的同学可能会想用一个大顶堆(优先级队列)来存放这个窗口里的k个数字,这样就可以知道最大的最大值是多少了, **但是问题是这个窗口是移动的,而大顶堆每次只能弹出最大值,我们无法移除其他数值,这样就造成大顶堆维护的不是滑动窗口里面的数值了。所以不能用大顶堆。**
|
||||||
|
|
||||||
@ -66,7 +66,7 @@ public:
|
|||||||
|
|
||||||
**可惜了,没有! 我们需要自己实现这么个队列。**
|
**可惜了,没有! 我们需要自己实现这么个队列。**
|
||||||
|
|
||||||
然后在分析一下,队列里的元素一定是要排序的,而且要最大值放在出队口,要不然怎么知道最大值呢。
|
然后再分析一下,队列里的元素一定是要排序的,而且要最大值放在出队口,要不然怎么知道最大值呢。
|
||||||
|
|
||||||
但如果把窗口里的元素都放进队列里,窗口移动的时候,队列需要弹出元素。
|
但如果把窗口里的元素都放进队列里,窗口移动的时候,队列需要弹出元素。
|
||||||
|
|
||||||
@ -74,9 +74,9 @@ public:
|
|||||||
|
|
||||||
大家此时应该陷入深思.....
|
大家此时应该陷入深思.....
|
||||||
|
|
||||||
**其实队列没有必要维护窗口里的所有元素,只需要维护有可能成为窗口里最大值的元素就可以了,同时保证队里里的元素数值是由大到小的。**
|
**其实队列没有必要维护窗口里的所有元素,只需要维护有可能成为窗口里最大值的元素就可以了,同时保证队里的元素数值是由大到小的。**
|
||||||
|
|
||||||
那么这个维护元素单调递减的队列就叫做**单调队列,即单调递减或单调递增的队列。C++中没有直接支持单调队列,需要我们自己来一个单调队列**
|
那么这个维护元素单调递减的队列就叫做**单调队列,即单调递减或单调递增的队列。C++中没有直接支持单调队列,需要我们自己来实现一个单调队列**
|
||||||
|
|
||||||
**不要以为实现的单调队列就是 对窗口里面的数进行排序,如果排序的话,那和优先级队列又有什么区别了呢。**
|
**不要以为实现的单调队列就是 对窗口里面的数进行排序,如果排序的话,那和优先级队列又有什么区别了呢。**
|
||||||
|
|
||||||
@ -185,7 +185,7 @@ public:
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
在来看一下时间复杂度,使用单调队列的时间复杂度是 O(n)。
|
再来看一下时间复杂度,使用单调队列的时间复杂度是 O(n)。
|
||||||
|
|
||||||
有的同学可能想了,在队列中 push元素的过程中,还有pop操作呢,感觉不是纯粹的O(n)。
|
有的同学可能想了,在队列中 push元素的过程中,还有pop操作呢,感觉不是纯粹的O(n)。
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user