File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 8989151. 颠倒字符串中的单词
9090152. 乘积最大子数组
9191153. 寻找旋转排序数组中的最小值
92+ 154. 寻找旋转排序数组中的最小值 II
9293155. 最小栈
9394160. 相交链表
9495162. 寻找峰值
Original file line number Diff line number Diff line change 1010九、位运算
1111十、数学
1212十一、图
13+ 十二、二分查找
1314
1415
1516一、树
16216311. 盛最多水的容器(双指针)
16316415. 三数之和(三指针)
16416531. 下一个排列(置换)
165- 33. 搜索旋转排序数组(二分查找)
166- 34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)
16716641. 缺失的第一个正数(置换,排序,集合)
16816748. 旋转图像(置换)
16916854. 螺旋矩阵(四指针)
17016956. 合并区间(二维数组排序)
17117059. 螺旋矩阵 II(四指针)
17217175. 颜色分类(单指针,双指针)
173- 81. 搜索旋转排序数组 II(二分查找)
17417288. 合并两个有序数组(排序,双指针)
175173128. 最长连续序列(集合,排序)
176174136. 只出现一次的数字(哈希表,列表,位运算)
177- 153. 寻找旋转排序数组中的最小值(二分查找)
178- 162. 寻找峰值(二分查找)
179175169. 多数元素(排序,哈希表,投票,计数,分治)
180176215. 数组中的第K个最大元素(快速排序,堆排序)
181177238. 除自身以外数组的乘积(前缀和)
191187560. 和为 K 的子数组(前缀和,哈希表)
192188581. 最短无序连续子数组(排序,双指针)
193189621. 任务调度器(桶填充)
194- 704. 二分查找
195190867. 转置矩阵(置换)
196191
197192
221216
222217
223218十、数学
224- 29. 两数相除(二分查找)
225- 69. x 的平方根(二分查找)
226219470. 用 Rand7() 实现 Rand10()(拒绝采样)
227220
221+
228222十一、图
229223207. 课程表(拓扑排序)
230- 399. 除法求值(并查集)
224+ 399. 除法求值(并查集)
225+
226+
227+ 十二、二分查找
228+ 4. 寻找两个有序数组的中位数(排序,双指针,二分查找)
229+ 29. 两数相除(二分查找)
230+ 33. 搜索旋转排序数组(二分查找)
231+ 34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)
232+ 81. 搜索旋转排序数组 II(二分查找)
233+ 69. x 的平方根(二分查找)
234+ 153. 寻找旋转排序数组中的最小值(二分查找)
235+ 154. 寻找旋转排序数组中的最小值 II(二分查找)
236+ 162. 寻找峰值(二分查找)
237+ 240. 搜索二维矩阵 II(二分查找)
238+ 287. 寻找重复数(哈希表,快慢指针,二分查找,位运算)
239+ 704. 二分查找
Original file line number Diff line number Diff line change 33
44/*
55二分查找:二分寻找最小值索引
6-
6+ --------------------------------------------------------------------
77递增序列:
88 *
99 *
2020 *
2121 *
2222 *
23+ ---------------------------------------------------------------------
24+ 例一: 1 2 3 4 5
25+ 右排序数组
26+ 例二: 3 4 5 | 1 2
27+ 左排序数组 右排序数组
2328
29+ 1、寻找旋转数组的最小元素即为寻找 右排序数组 的首个元素 nums[x],称 x 为 旋转点
30+ 2、左排序数组任一元素 >= 右排序数组任一元素
31+ 3、中值跟右值比较,而不跟左值比较的原因是,右值一定在右排序数组,左值不一定在左排序数组,所以跟左值比较时不能确定中值在哪个排序数组,从而无法确定缩小区间范围
32+ 如例一左值在右排序数组,例二左值在左排序数组
33+ ---------------------------------------------------------------------
24343 4 5 1 2
2535↑ ↑ ↑
2636l mid r
Original file line number Diff line number Diff line change 1+ // 154. 寻找旋转排序数组中的最小值 II
2+ // 剑指offer同题“11. 旋转数组的最小数字”
3+
4+ /*
5+ 1、二分查找,比“153. 寻找旋转排序数组中的最小值”多了重复元素
6+ 2、当中值等于右值时,无法区分二段性,让右指针左移,去掉一个干扰项
7+
8+ 7 0 1 1 1 1 1 2 3 4
9+ ↑ ↑ ↑
10+ l m r
11+ =============================
12+ 7 0 1 1 1 1 1 2 3 4
13+ ↑ ↑ ↑
14+ l m r
15+ =============================
16+ 7 0 1 1 1 1 1 2 3 4
17+ ↑ ↑ ↑
18+ l m r
19+ =============================
20+ 7 0 1 1 1 1 1 2 3 4
21+ ↑ ↑
22+ l/m r
23+ =============================
24+ 7 0 1 1 1 1 1 2 3 4
25+ ↑
26+ l/r
27+ */
28+ class Solution {
29+ public int findMin (int [] nums ) {
30+ int left = 0 , right = nums .length - 1 ;
31+ while (left < right ) {
32+ int mid = (left + right ) / 2 ;
33+ if (nums [mid ] < nums [right ]) {
34+ right = mid ;
35+ } else if (nums [mid ] > nums [right ]) {
36+ left = mid + 1 ;
37+ } else {
38+ right --;
39+ }
40+ }
41+ return nums [left ];
42+ }
43+ }
Original file line number Diff line number Diff line change 11// 11. 旋转数组的最小数字
2+ // 力扣同题“154. 寻找旋转排序数组中的最小值 II”
3+
4+ /*
5+ 二分查找
6+ */
7+ public class Solution {
8+ public int minNumberInRotateArray (int [] array ) {
9+ int left = 0 , right = array .length - 1 ;
10+ while (left < right ) {
11+ int mid = (left + right ) / 2 ;
12+ if (array [mid ] < array [right ]) {
13+ right = mid ;
14+ } else if (array [mid ] > array [right ]) {
15+ left = mid + 1 ;
16+ } else {
17+ right --;
18+ }
19+ }
20+ return array [left ];
21+ }
22+ }
223
324
425/*
You can’t perform that action at this time.
0 commit comments