diff --git a/notes/src/SUMMARY.md b/notes/src/SUMMARY.md index c917d3c..356c249 100644 --- a/notes/src/SUMMARY.md +++ b/notes/src/SUMMARY.md @@ -3,6 +3,7 @@ # 数组 - [总结](./array.md) +- [二分查找](./bin_search.md) - [移除元素](./remove_elements.md) - [长度最小的子数组](./minimum_size_subarray_sum.md) - [三数相加](./three_sum.md) @@ -23,6 +24,7 @@ - [替换空格](./substitute_spaces.md) - [翻转字符串里的单词](./reverse_words_in_a_string.md) - [左旋转字符串](./reverse_left_words.md) +- [KMP](./kmp.md) - [重复的子字符串](./repeated_substring_pattern.md) # 栈与队列 @@ -64,10 +66,12 @@ - [排序](./stl_sorting.md) - [哈希表](./stl_hash_table.md) - [字符串](./stl_string.md) +- [优先级队列](./stack_and_queue.md) # 经典代码 - [排序算法](./sorting.md) - [二分查找](./bin_search.md) - [KMP](./kmp.md) +- [单调队列](./stack_and_queue.md) - [合并两个有序链表](./merge_two_sorted_linked_lists.md) diff --git a/notes/src/stack_and_queue.md b/notes/src/stack_and_queue.md index d565317..06d21cd 100644 --- a/notes/src/stack_and_queue.md +++ b/notes/src/stack_and_queue.md @@ -19,7 +19,13 @@ 使用场景:通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置。 -从栈底到栈顶单调递减栈用来寻找右边更大元素,单调递增栈用来寻找右边更小元素。 +拿找右边第一个比自己大的元素举例: + +栈中存储元素的下标 i,比较栈顶元素 arr[i] 和当前元素 arr[j] 的大小, + +如果栈顶元素 < 当前元素,那么 j - i 就是答案,栈顶元素出栈(注意是循环出栈,直到栈顶元素 > 当前元素); + +如果栈顶元素 > 当前元素,则当前元素入栈。 时间复杂度:O(n) @@ -140,7 +146,7 @@ class MyQueue { } void push(int value) { - // 当我们要插入的元素比队尾元素大时,就一直弹出队尾元素,直到小于等于队尾元素为止? + // 当我们要插入的元素比队尾元素大时,就一直弹出队尾元素,直到小于等于队尾元素为止 // 这样做没问题吗? // 没问题,因为我们只关注队首元素是不是最大的,其它元素要不要都无所谓。 while (value > que.back() && !que.empty()) {