题目分析:[[EVD]] - 剑指 Offer 11. 旋转数组的最小数字https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof/
简单描述:
- 将升序数组旋转后得到新数组作为输入,找出其中的最小数字
限制🚫
- n == numbers.length
- 1 <= n <= 5000
- 5000 <= numbers[i] <= 5000
- numbers 原来是一个升序排序的数组,并进行了 1 至 n 次旋转
示例:
输入:[3,4,5,1,2]
输出:1
解题思路:
思路:
- 1. #排序 排序后输出第一个数nums[0]
- 利用algorithm中的sort进行排序 #[[C++ STL]]
- 2. #二分查找 找到数值突变的左边界点(升序序列旋转后的分割点),就是最小值
- 比较基准:数组最后一个数(分割后的右部分最大值)
- left[all]>right[all],min<right[all-min]
效率:
- 时间复杂度
- 空间复杂度
代码:
- 1.排序
class Solution
{
public:
/*c++库函数sort进行排序,自己实现可在排序中途找到旋转点时结束递归并返回对应数值*/
int minArray(vector<int> &numbers)
{
sort(numbers.begin(), numbers.end());
return numbers[0];
}
};
- 2.二分查找
class Solution
{
public:
/*二分法找到数值突变的左边界点,就是最小值*/
int minArray(vector<int> &numbers)
{
int l = 0, r = numbers.size() - 1;
while (l <= r)
{
int m = l + (r - l) / 2;
if (numbers[m] > numbers[r])
l = m + 1; //往右边找
else if (numbers[m] == numbers[r])
r--;
else
r = m; //往左边找
}
return numbers[l]; //二分完后 l=r+1,即旋转点
}
};