Skip to content

Commit 8c874e8

Browse files
committed
update content
1 parent 8018255 commit 8c874e8

3 files changed

+16
-10
lines changed

算法思维系列/二分查找详解.md

+10-6
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ int binarySearch(int[] nums, int target) {
102102

103103
答:因为初始化 `right` 的赋值是 `nums.length - 1`,即最后一个元素的索引,而不是 `nums.length`
104104

105-
这二者可能出现在不同功能的二分查找中,区别是:前者相当于两端都闭区间 `[left, right]`,后者相当于左闭右开区间 `[left, right)`因为索引大小为 `nums.length` 是越界的。
105+
这二者可能出现在不同功能的二分查找中,区别是:前者相当于两端都闭区间 `[left, right]`,后者相当于左闭右开区间 `[left, right)`因为索引大小为 `nums.length` 是越界的,所以我们把 `right` 这一边视为开区间
106106

107107
我们这个算法中使用的是前者 `[left, right]` 两端都闭的区间。**这个区间其实就是每次进行搜索的区间**
108108

@@ -117,7 +117,7 @@ int binarySearch(int[] nums, int target) {
117117

118118
`while(left <= right)` 的终止条件是 `left == right + 1`,写成区间的形式就是 `[right + 1, right]`,或者带个具体的数字进去 `[3, 2]`,可见**这时候区间为空**,因为没有数字既大于等于 3 又小于等于 2 的吧。所以这时候 while 循环终止是正确的,直接返回 -1 即可。
119119

120-
`while(left < right)` 的终止条件是 `left == right`,写成区间的形式就是 `[right, right]`,或者带个具体的数字进去 `[2, 2]`**这时候区间非空**,还有一个数 2,但此时 while 循环终止了。也就是说这区间 `[2, 2]` 被漏掉了,索引 2 没有被搜索,如果这时候直接返回 -1 就是错误的。
120+
`while(left < right)` 的终止条件是 `left == right`,写成区间的形式就是 `[right, right]`,或者带个具体的数字进去 `[2, 2]`**这时候区间非空**,还有一个数 2,但此时 while 循环终止了。也就是说区间 `[2, 2]` 被漏掉了,索引 2 没有被搜索,如果这时候直接返回 -1 就是错误的。
121121

122122
当然,如果你非要用 `while(left < right)` 也可以,我们已经知道了出错的原因,就打个补丁好了:
123123

@@ -492,10 +492,14 @@ int right_bound(int[] nums, int target) {
492492
left = mid + 1;
493493
}
494494
}
495-
// 此时 left - 1 索引越界
496-
if (left - 1 < 0) return -1;
497-
// 判断一下 nums[left] 是不是 target
498-
return nums[left - 1] == target ? (left - 1) : -1;
495+
// 判断 target 是否存在于 nums 中
496+
// if (left - 1 < 0) return -1;
497+
// return nums[left - 1] == target ? (left - 1) : -1;
498+
499+
// 由于 while 的结束条件是 right == left - 1,且现在在求右边界
500+
// 所以用 right 替代 left - 1 更好记
501+
if (right < 0) return -1;
502+
return nums[right] == target ? right : -1;
499503
}
500504
```
501505

算法思维系列/学习数据结构和算法的高效方法.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ tags: ['核心框架']
2222
2323
这是好久之前的一篇文章 [学习数据结构和算法的框架思维](https://mp.weixin.qq.com/s/gE-5KMi4bBvJovdsQXIKgw) 的修订版。之前那篇文章收到广泛好评,没看过也没关系,这篇文章会涵盖之前的所有内容,并且会举很多代码的实例,教你如何使用框架思维。
2424

25-
首先,这里讲的都是普通的数据结构,咱不是搞算法竞赛的,咱得目的是迅速提升算法能力,培养算法思维,真没必要整太偏太怪的题目。另外,以下是我个人的经验的总结,没有哪本算法书会写这些东西,所以请读者试着理解我的角度,别纠结于细节问题,因为这篇文章就是希望对数据结构和算法建立一个框架性的认识
25+
首先,这里讲的都是普通的数据结构,咱不是搞算法竞赛的,咱的目的是迅速提升算法能力,培养算法思维,真没必要整太偏太怪的题目。另外,以下是我个人的经验的总结,没有哪本算法书会写这些东西,所以请读者试着理解我的角度,别纠结于细节问题,因为这篇文章就是希望帮你对数据结构和算法建立一个框架性的认识
2626

2727
从整体到细节,自顶向下,从抽象到具体的框架思维是通用的,不只是学习数据结构和算法,学习其他任何知识都是高效的。
2828

算法思维系列/滑动窗口技巧进阶.md

+5-3
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ tags: ['滑动窗口', '核心框架', '数组']
4747
```cpp
4848
int left = 0, right = 0;
4949

50-
while (right < s.size()) {
50+
while (left < right && right < s.size()) {
5151
// 增大窗口
5252
window.add(s[right]);
5353
right++;
@@ -77,6 +77,7 @@ void slidingWindow(string s) {
7777
while (right < s.size()) {
7878
// c 是将移入窗口的字符
7979
char c = s[right];
80+
winodw.add(c)
8081
// 增大窗口
8182
right++;
8283
// 进行窗口内数据的一系列更新
@@ -89,9 +90,10 @@ void slidingWindow(string s) {
8990
/********************/
9091
9192
// 判断左侧窗口是否要收缩
92-
while (window needs shrink) {
93+
while (left < right && window needs shrink) {
9394
// d 是将移出窗口的字符
9495
char d = s[left];
96+
winodw.remove(d)
9597
// 缩小窗口
9698
left++;
9799
// 进行窗口内数据的一系列更新
@@ -475,13 +477,13 @@ int lengthOfLongestSubstring(string s) {
475477
| [862. Shortest Subarray with Sum at Least K](https://leetcode.com/problems/shortest-subarray-with-sum-at-least-k/?show=1) | [862. 和至少为 K 的最短子数组](https://leetcode.cn/problems/shortest-subarray-with-sum-at-least-k/?show=1) |
476478
| - | [剑指 Offer 48. 最长不含重复字符的子字符串](https://leetcode.cn/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof/?show=1) |
477479
| - | [剑指 Offer 57 - II. 和为s的连续正数序列](https://leetcode.cn/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/?show=1) |
480+
| - | [剑指 Offer II 008. 和大于等于 target 的最短子数组](https://leetcode.cn/problems/2VG8Kg/?show=1) |
478481
| - | [剑指 Offer II 009. 乘积小于 K 的子数组](https://leetcode.cn/problems/ZVAVXX/?show=1) |
479482
| - | [剑指 Offer II 014. 字符串中的变位词](https://leetcode.cn/problems/MPnaiL/?show=1) |
480483
| - | [剑指 Offer II 015. 字符串中的所有变位词](https://leetcode.cn/problems/VabMRr/?show=1) |
481484
| - | [剑指 Offer II 016. 不含重复字符的最长子字符串](https://leetcode.cn/problems/wtcaE1/?show=1) |
482485
| - | [剑指 Offer II 017. 含有所有字符的最短字符串](https://leetcode.cn/problems/M1oyTv/?show=1) |
483486
| - | [剑指 Offer II 057. 值和下标之差都在给定的范围内](https://leetcode.cn/problems/7WqeDu/?show=1) |
484-
| - | [剑指 Offer II 076. 数组中的第 k 大的数字](https://leetcode.cn/problems/xx4gT2/?show=1) |
485487

486488
</details>
487489

0 commit comments

Comments
 (0)