剑指 Offer 11. 旋转数组的最小数字
时间:2020年7月22日
知识点:二分法
题目链接: https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof/
题目
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。
示例1
输入:
[3,4,5,1,2]
输出: 1
示例2
输入:
[2,2,2,0,1]
输出: 0
解法
- 由题意可知数组中的最后一个元素 x:在最小值右侧的元素,它们的值一定都小于等于 x;而在最小值左侧的元素,它们的值一定都大于等于 x。
- 因此,我们可以根据这一条性质,通过二分查找的方法找出最小值。
- numbers[mid]<numbers[end] end = mid
- numbers[mid]>numbers[end] first = mid+1
- numbers[mid]=numbers[end] 无法确定mid在最小值的左侧还是右侧,又因为mid和end对于的值相等,只需end-=1
代码
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int findMin(vector<int>& nums) {
int start = 0, end = nums.size()-1;
while(start < end){
int mid = start + (end-start)/2;
if(nums[mid] < nums[end])
end = mid;
else
start = mid+1;
}
return nums[start];
}
};
int main()
{
vector<int> v(5,0);
v[0]=3;v[1]=4;v[2]=5;v[3]=1;v[4]=2;
vector<int> v2(5,0);
v2[0]=2;v2[1]=2;v2[2]=2;v2[3]=0;v2[4]=1;
Solution s;
cout<<s.minArray(v);
}
今天也是爱zz的一天哦!