旋转数组的最小数字
关键词:二分查找
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。
示例 1:
示例2:
思路
思路一:
利用二分查找的方式寻找转折点。
注意重复数字的情况。如[2 2 2 2 2 2]、[5 5 1 2 2 2 3 3]、[10 10 1 10 10 10]以及没有翻转的情况。
代码
思路一:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public: int minArray(vector<int>& numbers) { int len = numbers.size(); if(len <= 0) return 0; if(len == 0) return numbers[0]; int l = 0; int r = len - 1; while (l < r) { int mid = ((r - l) >> 1) + l; if (numbers[r] > numbers[mid]) { r = mid; } else if (numbers[r] < numbers[mid]) { l = mid + 1; } else r--; } return numbers[l]; } };
|
知识点
- 二分查找
- 重复数字情况的考虑