@@ -59,7 +59,7 @@ arr[i]的大小在[0, 10**8]之间。
59
59
60
60
这里有一个关键点: ** 如果两个数组的计数信息是一致的,那么两个数组排序后的结果也是一致的。** 如果你理解计数排序,应该明白我的意思。不明白也没有关系, 我稍微解释一下你就懂了。
61
61
62
- 如果我把一个数组打乱,然后排序,得到的数组一定是确定的,即不管你怎么打乱排好序都是一个确定的有序序列。这个论点的正确性是毋庸置疑的。而实际上,一个数组无论怎么打乱,其计数结果也是确定的,这也是毋庸置疑的。反之,如果是两个不同的数组 ,打乱排序后的结果一定是不同的,计数也是同理。
62
+ 如果我把一个数组打乱,然后排序,得到的数组一定是确定的,即不管你怎么打乱排好序都是一个确定的有序序列。这个论点的正确性是毋庸置疑的。而实际上,一个数组无论怎么打乱,其计数结果也是确定的,这也是毋庸置疑的。反之,如果是两个排序后不同的数组 ,打乱排序后的结果一定是不同的,计数也是同理。
63
63
64
64
![ ] ( https://p.ipic.vip/i9mrda.jpg )
65
65
(这两个数组排序后的结果以及计数信息是一致的)
@@ -68,7 +68,7 @@ arr[i]的大小在[0, 10**8]之间。
68
68
69
69
- 先排序 arr,不妨记排序后的 arr 为 sorted_arr
70
70
- 从左到右遍历 arr,比如遍历到了索引为 i 的元素,其中 0 <= i < len(arr)
71
- - 如果 arr[ : i +1] 的计数信息和 sorted_arr[ : i +1] 的计数信息一致,那么说明可以分桶,否则不可以 。
71
+ - 如果 arr[ : i +1] 的计数信息和 sorted_arr[ : i +1] 的计数信息一致,那么说明可以 ** 贪心地 ** 切分,否则一定不可以分割 。
72
72
73
73
> arr[ : i +1] 指的是 arr 的切片,从索引 0 到 索引 i 的一个切片。
74
74
@@ -197,6 +197,8 @@ class Solution(object):
197
197
198
198
比如 [ 2,1,3,4,4] ,遍历到 1 的时候会发现 1 比 2 小,因此 2, 1 需要在一块,我们可以将 2 和 1 融合,并** 重新压回栈** 。那么融合成 1 还是 2 呢?答案是 2,因为 2 是瓶颈,这提示我们可以用一个递增栈来完成。
199
199
200
+ > 为什么 2 是瓶颈?因此我们需要确保当前值一定比前面所有的值的最大值还要大。因此只需要保留最大值就好了,最大值就是瓶颈。而 1 和 2 的最大值是 2,因此 2 就是瓶颈。
201
+
200
202
因此本质上** 栈存储的每一个元素就代表一个块,而栈里面的每一个元素的值就是块的最大值** 。
201
203
202
204
以 [ 2,1,3,4,4] 来说, stack 的变化过程大概是:
0 commit comments