首页 > 剑指offer:面试题11. 旋转数组的最小数字

剑指offer:面试题11. 旋转数组的最小数字

题目:旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [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

解题:

方法一:从头开始遍历

时间复杂度O(n),空间复杂度O(1)

这不是最佳的解法,我们没有充分利用旋转数组的这个条件,如何最大限度的活用这个旋转数组的条件.

class Solution {
public:int minArray(vector& numbers) {if(numbers.size()==0) return 0;int min = numbers[0];for (int i=0;inumbers[i]) min=numbers[i];}return min;}
};

方法二:二分法查找

虽然这道题不是严格的单调递增序列,但是我们这里仍然可以借用二分查找法的思想。

我们设置left,mid,right分别指向旋转数组最左边、中间以及最右边的数字。

  • 当rotateArray[mid]>rotateArray[right],说明最小值一定在[mid+1,right]上
  • 当rotateArray[mid]
  • 当这两者相等时,我们没有办法,只能顺序搜索。

若以右边界为基准,时间复杂度为O(logn),空间复杂度为O(1)

class Solution {
public:int minArray(vector& numbers) {int right = numbers.size()-1;int left = 0;while (left < right) {int mid = (right-left) / 2 + left;if(numbers[right]>numbers[mid]) {right=mid; } else if(numbers[right]

更多相关:

  • 学习目标:了解什么是数组;数组如何访问内存地址(一维,二维);什么是数组是由相同类型的元素的集合所组成的数据结构,分配一块连续的内存来存储。利用元素的索引可以计算出该元素对应的存储地址。 最简单的数据结构类型是一维数组。数组如何实现随机访问?数组是一种线性表数据结构,用一直连续的内存空间来储存一组具有相同类型的数据。根据数组的特性(连...

  • 一、静态数据及动态数组的创建     静态数据:               int a[10];             int a[]={1,2,3};             数组的长度必须为常量。     动态数组:             int len;             int *a=new int...

  • 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 示例 1: 给定 nums = [3,2,2,3], val...

  • 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 示例 1: 给定数组 nums = [1,1,2],  函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2...

  • 文章目录1. 数组的声明2. 数组元素的遍历3. 数组的截取4. Go 语言的切片5. 数组 和 切片的共同点...

  •   a.需求分析:   自动生成小学四则运算题目的命令行 “软件”,满足以下需求:    除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24运算符为 +, −, ×, ÷并且要求能处理用户的输入,并判断对错,打分统计正确率。要求能处理用户输入的真分数, 如 1/2, 5/12 等使用 -n 参...