题目描述:

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

解题思路:

最直观的想法就是遍历一遍数组,找到最小值,但这样明显没有用到旋转数组这个信息。

由于这个旋转的操作实际上是将原数组划分成了两个有序的数组,第一个数组是大于第二个数组的,所以考虑用二分的思想。设定两个指针,指针p1指向第一个递增数组,指针p2指向第二个递增数组,两个指针的中间值mid和对应两个指针所指向的值对比,若mid比p1所值元素大,则说明最小元素在后半段,此时p1移动到mid位置,数组长度减半;若mid比p2所值元素小,则说明最小元素在前半段,此时p2移到mid位置。这样到最后,p1和p2就相临,其中p1指向第一个递增数组的最后一位,p2指向第二个递增数组的第一位,即最小值为p2所值元素。

需要注意以下两个特殊情况:

1. 若原数组没有旋转,那么第一个元素即为最小值;

2. 若左右指针所指元素和中间元素都相等,此时就无法决定指针要如何移动,即无法确定最小元素在前半段还是后半段。此时只能通过顺序查找最小元素。

时间复杂度为O(logn),最坏情况下为O(n)。

代码:

class Solution {
public:
int minNumberInRotateArray(vector<int> rotateArray)
{
if(rotateArray.empty())
{
return ;
}
int left=;
int right=rotateArray.size()-;
if(rotateArray[left]<rotateArray[right])
{
return rotateArray[left];
}
int mid = left;
while(right>left)
{
mid=(right+left)/;
int middle=rotateArray[mid];
int leftNumber=rotateArray[left];
int rightNumber=rotateArray[right];
if((right-left)==)
{
return rightNumber;
}
//左中右的值全都相等,不能确定在前还是在后,只能遍历查后一个比前一个小就是最小值
if(middle==leftNumber&&middle==rightNumber)
{
for(int i=left;i<right;i++)
{
if(rotateArray[i]>rotateArray[i+])
{
return rotateArray[i+];
}
}
//全相等的话直接返回最左值就行了
return leftNumber;
}
else if(middle<leftNumber)
{
right=mid;
}
else if(middle>rightNumber)
{
left=mid;
}
}
return rotateArray[mid];
}
};

剑指offer:旋转数组的最小数字的更多相关文章

  1. 剑指Offer 旋转数组的最小数字

    题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转 ...

  2. 剑指Offer——旋转数组的最小数字

    题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一 ...

  3. 用js刷剑指offer(旋转数组的最小数字)

    题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个 ...

  4. 剑指Offer_11_旋转数组的最小数字

    题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出一个旋转数组的最小元素. 例如: {3,4,5,1,2} 为 {1,2,3,4,5} ...

  5. 剑指offer-7.旋转数组的最小数字

    看起来不需要用二分法查找 --------------------------------------------------------- 时间限制:3秒 空间限制:32768K 热度指数:5098 ...

  6. 剑指Offer-6.旋转数组的最小数字(C++/Java)

    题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转, ...

  7. 剑指offer6:旋转数组的最小数字

    1. 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一 ...

  8. 剑指offer8 旋转数组的最小数字

    一种错误写法: class Solution { public: int minNumberInRotateArray(vector<int> rotateArray) { int len ...

  9. 剑指offer-旋转数组的最小数字06

    题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋 ...

  10. 剑指offer-旋转数组的最小数字-数组-python

    题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转 ...

随机推荐

  1. Linux文本编辑器-vi/vim

    vi是Linux命令行界面下的文字编辑器,vim是vi的增强版(Vi IMproved),完全兼容 可以理解成普通的txt文本与word文档之间的差距. 注:还有一款全屏编辑器是nano,可以了解下 ...

  2. Onvif获取rstp地址GetCapabilities能力时,出现error 4或者52的的解决方法

    在获取Onvi能力soap_call___tds__GetCapabilities的接口中有时候会出现error:4或者52的情况,是因为在soapC.c中用不到extension,所以我们必须得把它 ...

  3. Scala的高级特性

    高阶函数 概念 Scala混合了面向对象和函数式的特性,我们通常将可以作为参数传递到方法中的表达式叫做函数.在函数式编程语言中,函数是“头等公民”,高阶函数包含:作为值的函数.匿名函数.闭包.柯里化等 ...

  4. LVM Linear vs Striped Logical Volumes

    转自:https://sysadmincasts.com/episodes/27-lvm-linear-vs-striped-logical-volumes About Episode - Durat ...

  5. mfc 函数重载

    函数重载的概念 for循环中变量 一. 函数重载的概念 函数重载允许我们使用相同的函数名定义多个函数. 提示: 函数参数类型不同,可重载. 类型相同时,则需要参数个数不同. int max(int a ...

  6. PyQt5 笔记(05):信号/槽

    PyQt 的很多类都内置了信号和槽.下图是 Qt 官方文档对 QThread 类中包含的信号/槽的描述: 一.信号/槽 都是内置的 请看一个最简单的程序: 按钮点击后,窗口关闭 代码: class T ...

  7. 【转】numpy教程

    [转载说明] 本来没有必要转载的,只是网上的版本排版不是太好,看的不舒服.所以转过来,重新排版,便于自己查看. 基础篇 NumPy的主要对象是同种元素的多维数组. 这是一个所有的元素都是一种类型.通过 ...

  8. 洛谷 P3795 钟氏映射

    洛谷 P3795 钟氏映射 题目背景 2233年,CSSYZ学校的数学老师兼数学竞赛顾问钟JG已经2200+岁啦! 为了庆生,他或她给广大人民群众出了道题. 题目描述 设集合N=M={x∣x∈N+​, ...

  9. PDO访问方式操作数据库

    mysqli是专门访问MySQL数据库的,不能访问其它数据库.PDO可以访问多种的数据库,它把操作类合并在一起,做成一个数据访问抽象层,这个抽象层就是PDO,根据类操作对应的数据库.mysqli是一个 ...

  10. codeforces 914 D 线段树+数学

    题意 给出一个长度为\(n\)的数列\(a\),两种询问,第一种给出三个数\(l,r,x\),区间\([l,r]\)的\(gcd\)值是否和\(x\)相似,若最多改变区间\([l,r]\)中的一个数使 ...