面试题8:旋转数组的最小数字



//把一个数组最开始的若干个元素搬到数组的末尾。eg:{3,4,5,1,2}是{1,2,3,4,5}的旋转数组

#include "stdafx.h"
#include <iostream>
using namespace std;
int MinInOrder(int data[],int index1,int index2);
int Min(int data[],int length)
{
    if(data==NULL||length<=0)
        throw new exception("Invalid Parameters:");

    int index1=0;
    int index2=length-1;
    int indexMid=index1;//tips1:
    while(data[index1]>=data[index2])
    {
        if(index2-index1==1)
        {
            indexMid=index2;
            break;
        }
        indexMid=(index1+index2)/2;

        //tips2:如果index1,index2,indexMid三者相同,就只能顺序查找
        if(data[index1]==data[index2]&&data[index1]==data[indexMid])
            return MinInOrder(data,index1,index2);
        if(data[indexMid]>=data[index1])
            index1=indexMid;
        else if(data[indexMid]<=data[index2])
            index2=indexMid;
    }
    return data[indexMid];
}

int MinInOrder(int data[],int index1,int index2)
{
    int result=data[index1];
    for(int i=index1+1;i<index2;i++)
    {
        if(result>data[i])
            result=data[i];
    }
    return result;
}

int _tmain(int argc, _TCHAR* argv[])
{
    int *data=NULL;
    //int data[1]={1};
    //int data[5]={1,2,3,4,5};
    //int data[5]={3,4,5,1,2};
    //int data[5]={1,1,1,0,1};
    cout<<Min(data,5)<<endl;
    return 0;
}

 

tips1:把indexMid初始化为index1是因为,一旦发现数组中第一个数字小于最后一个数字,表明该数组是排序的,就可以直接返回第一个数字了。

tips2:如果index1,index2,indexMid三者相同,无法判断中间数字是位于前面子数组还是后面数组中,也就无法移动两个指针来缩小查找范围。此时,不得不采用顺序查找。
时间: 2024-11-08 22:35:09

面试题8:旋转数组的最小数字的相关文章

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

面试题 11. 旋转数组的最小数字 题目描述 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转, 输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. NOTE:给出的所有元素都大于0,若数组大小为0,请返回0. 解答 复杂度:O(logN) + O(1) public class Solution { public int minNumberInRotateArray(int

剑指offer面试题8——旋转数组的最小数字

题目1386:旋转数组的最小数字 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6708 解决:1505 题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为一个整数n(1<= n<=1000000):代表旋转数组的元素个数. 输入的第二行包括n

面试题:旋转数组的最小数字

题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增的排序的数组的一个旋转,输出旋转数组的最小元素.例如输入{1,2,3,4,5}的一个旋转为{3,4,5,1,2},该数组的最小值为1. 分析:首先想到的肯定是遍历一遍找出最小的元素,但是这样的时间复杂度为o(n),且没有利用到旋转数组的特性.观察可得,旋转数组可以分为两个有序的子数组.而且前一个数组的元素均大于后一个数组.这个发现对于我们解题将起到一个至关重要的作用.而更神奇的是最小的元素刚好是这两个子数组的分界

【剑指Offer学习】【面试题8 : 旋转数组的最小数字】

题目: 把一个数组最开始的若干个元素搬到数组的末尾, 我们称之数组的旋转.输入一个递增排序的数组的一个旋转, 输出旋转数组的最小元素.例如数组{3,4, 5, 1, 2 }为{ l1,2,3, 4,5}的一个旋转,该数组的最小值为1 实现代码如下: public class Test08 { /** * 把一个数组最开始的若干个元素搬到数组的末尾, 我们称之数组的旋转. * 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素. * 例如数组{3, 4, 5, 1, 2}为{l ,2, 3,

面试题08_旋转数组的最小数字——剑指offer系列

题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素. 例如:数组{3, 4, 5, 1 , 2} 是 数组{1,2,3,4,5}的一个旋转,该数组最小的数是1. 我们要做的就是找到这个旋转后数组的最小数. 解题思路: 思路1:直接遍历数组,找到最小的数,简单粗暴,时间复杂度O(n),空间复杂度O(1). 一般情况下,能够做到思路一的时空复杂度就很好了,但是这个题目,还可以有更好的思路,将时间复杂度降低. 思路2:

剑指offer-面试题8.旋转数组的最小数字

题目:把一个数组最开始的若干个元素搬到数据的末尾,我们称之为 数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组 的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该 数组的最小值为1. 这道题可以使用类似于二分查找的思想,算法思路如下: 1.假设有一个旋转数组A,我们设两个索引p1,p2 2.p1指向为数组第一个元素,p2指向为数组最后一个元素 3.取p3为数组中的中间元素 4.比较p3指向的元素与p1,p2.若p3>p1,则说明前半个    子数组为递增数

11&amp;12. 旋转数组的最小数字

面试题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 class Solution { public int findMin(int[] nums) { int l = 0, h

【剑指Offer面试题】 九度OJ1386:旋转数组的最小数字

题目链接地址: http://ac.jobdu.com/problem.php?pid=1386 题目1386:旋转数组的最小数字 时间限制:1 秒内存限制:32 兆特殊判题:否提交:6914解决:1534 题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为

剑指offer 面试题8:旋转数组的最小数字 题解

面试题8:旋转数组的最小数字 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个已从小到大排好序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1.(要求不能直接遍历数组来求解.) 提交网址: http://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba?tpId=13&tqId=11159 或 http: