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

/////////////////////////////////////////////////////////////////////////////////////////////

//12. 题目八:旋转数组的最小数字

int RotatedBinarySearchMinNum(int aiArray[], int iLen)
{
    int iLeft = 0;
    int iMid = 0;
    int iRight = iLen - 1;

    while (aiArray[iLeft] >= aiArray[iRight])
    {
        if (iRight - iLeft == 1)
        {
            iMid = iRight;
            break;
        }

        iMid = iLeft + (iRight - iLeft) / 2;
        if (aiArray[iMid] >= aiArray[iLeft])
        {
            iLeft = iMid;
        }
        else if (aiArray[iMid] <= aiArray[iRight])
        {
            iRight = iMid;
        }
    }

    return aiArray[iMid];
}

// 旋转数组中查找
int RotatedBinarySearch(int aiArray[], int iLen, int iTarget)
{
    int iLeft = 0;
    int iMid = 0;
    int iRight = iLen - 1;

    while (iLeft <= iRight)
    {
        iMid = iLeft + (iRight - iLeft) / 2;
        if (aiArray[iMid] == iTarget)
        {
            return iMid;
        }

        // 情况一:旋转点在中位数的右侧
        if (aiArray[iMid] >= aiArray[iLeft])
        {
            // 最左侧元素 <= 查找目标 < 中位数
            if (aiArray[iLeft] <= iTarget && iTarget < aiArray[iMid])
            {
                iRight = iMid - 1;
            }
            else
            {
                iLeft = iMid + 1;
            }
        }
        // 情况二: 旋转点在中位数的左侧
        else
        {
            // 中位数 < 查找目标 <= 最右侧元素
            if (aiArray[iMid] < iTarget && iTarget <= aiArray[iRight])
            {
                iLeft = iMid + 1;
            }
            else
            {
                iRight = iMid - 1;
            }
        }
    }

    return -1;
}

void RotatedBinarySearchTestFunc()
{
    cout << "\n\n --------------- RotatedBinarySearchTestFunc Start -------------->" << endl;
    int aiArray[] = {9, 10, 11, 12, 13, 1, 3, 4, 5, 8};
    int iLen = sizeof(aiArray) / sizeof(int);
    TRAVERSAL_ARRAY(aiArray, iLen);

    cout << "旋转数组中最小数字: " << RotatedBinarySearchMinNum(aiArray, iLen) << endl;

    int iFindNum = 5;
    int iIndex = RotatedBinarySearch(aiArray, iLen, iFindNum);
    if (iIndex > 0)
    {
        printf("Find %02d[%02d] Success!", iFindNum, iIndex);
    }
    else
    {
        cout << "Find: " << iFindNum << " Failed!" << endl;
    }

    cout << "\n\n --------------- RotatedBinarySearchTestFunc Start -------------->" << endl;

}

原文地址:https://www.cnblogs.com/yzdai/p/11258624.html

时间: 2024-11-05 22:51:51

题目八:旋转数组的最小数字的相关文章

剑指Offer面试题:7.旋转数组的最小数字

一.题目:旋转数组的最小数字 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 这道题最直观的解法并不难,从头到尾遍历数组一次,我们就能找出最小的元素.这种思路的时间复杂度显然是O(n).但是这个思路没有利用输入的旋转数组的特性,肯定达不到面试官的要求. 我们注意到旋转之后的数组实际上可以划分为两个排序的子数组,而且前面的子数组的

程序员面试题目总结--数组(三)【旋转数组的最小数字、旋转数组中查找指定数、两个排序数组所有元素中间值、数组中重复次数最多的数、数组中出现次数超过一半的数】

转!http://blog.csdn.net/dabusideqiang/article/details/38271661 11.求旋转数组的最小数字 题目:输入一个排好序的数组的一个旋转,输出旋转数组的最小元素. 分析:数组的旋转:把一个数组最开始的若干个元素搬到数组的末尾.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1.这道题最直观的解法并不难.从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N).但这个思路没有利用输入数组

【剑指offer】旋转数组的最小数字

题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 分析描述: 求一个数组中的最小值,最简单的办法就是逐个比较数组中各个元素的值,遍历完整个数组,即可得数组中最小元素.但这种方法存在的问题是时间复杂度为O(n). 利用题目中给出的条件:递增排序数组的旋转.利用递增排序的特点,可以用二分查找方法实现时间复杂度为O(logn)的查找.

《剑指offer》— JavaScript(6)旋转数组的最小数字

旋转数组的最小数字 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. NOTE:给出的所有元素都大于0,若数组大小为0,请返回0. 实现代码 function minNumberInRotateArray(rotateArray) { var len=rotateArray.length; if(len== 0 || !r

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

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

【剑指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之旋转数组的最小数字(九度OJ1386)

题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为一个整数n(1<= n<=1000000):代表旋转数组的元素个数. 输入的第二行包括n个整数,其中每个整数a的范围是(1<=a<=10000000). 输出: 对应每个测试案例, 输出旋转数组

旋转数组的最小数字(剑指offer 二分 O(log n))

旋转数组的最小数字 参与人数:1866时间限制:1秒空间限制:32768K 通过比例:15.04% 最佳记录:0 ms|8552K(来自  左小右) 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减序列的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 题目链接:http://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a

旋转数组的最小数字-剑指Offer

旋转数组的最小数字 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. NOTE:给出的所有元素都大于0,若数组大小为0,请返回0. 思路 使用二分查找,因为该旋转数组是两段排序好的数组,可根据中间值判断中间值属于哪个排列数组,逐渐缩小范围. 注意考虑特殊情况,数组可能出现多个元素相等 代码 public class Sol