博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
求旋转数组的最小元素
阅读量:4518 次
发布时间:2019-06-08

本文共 1472 字,大约阅读时间需要 4 分钟。

(把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1)

除了正常情况,还要注意考虑三种特殊情况:

(1). 数组是没有发生过旋转的 {1,2,3,4,5,6}

(2). 全相等的数组 {1,1,1,1,1,1}

(3). 大部分都相等的数组 {1,0,1,1,1,1}

 二分查找的思路,最开始  如果数组没有旋转过,直接返回第一个元素,就是最小的元素; 如果旋转过,再按后续

首先获得 mid。 此时 ,若

  (1)  如果 ar[mid] > ar[left], 代表最小值肯定在后半区  left = mid + 1

  (2)  如果 ar[mid] < ar[left], 代表最小值肯定是在前半区到mid之间的(mid也有可能是最小值),  right = mid

  (3)  如果 ar[mid] == ar[left], 这种情况不好说了,需要进一步分析:

                 (1)若 ar[mid] == ar[right] , 最麻烦的情况,前中后都相等,只好排除首尾,继续找   left++   right--

                 (2)若 ar[mid] < ar[right], 代表最小值肯定在前半区, right = mid

                 (3)若 ar[mid] > ar[right], 代表最小值肯定在后半区, left = mid + 1

int xuanzhaunjuzhen(int ar[],int left,int right){    int mid;    while (left < right)    {        if (ar[left] < ar[right])         //代表没有旋转过            return ar[left];        mid = (left + right)/2;        if (ar[mid] > ar[left])         // 最小值在后半区            left = mid + 1;        else if (ar[mid] < ar[left])    // 最小值在前半区到mid之间            right = mid;                 //mid也可能是最小值        else                        //ar[mid] == ar[left]         {            if (ar[mid] == ar[right])            {                ++left;                --right;            }            else if (ar[mid] < ar[right])     //在前半区                right = mid - 1;            else           //ar[mid] > ar[right]    在后半区                left = mid + 1;        }    }    return ar[left];}

 

 

转载于:https://www.cnblogs.com/itachi7/archive/2012/09/28/2706602.html

你可能感兴趣的文章
Ogre1.8.1 Basic Tutorial 6 - The Ogre Startup Sequence
查看>>
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(36)-文章发布系统③-kindeditor使用...
查看>>
c# Winform 开发分屏显示应用程序
查看>>
canvas刮奖
查看>>
javascript 模拟滚动 隐藏滚动条
查看>>
手把手教你使用 Clion 开发 Linux C++ 项目
查看>>
阿里巴巴卖空阿里巴巴入股新浪微博抑制投资者卖空行为
查看>>
分析打开hdu 3335 (最小路径覆盖)
查看>>
添加源ubuntu_x64 安装 Adobe Reader
查看>>
NFS-heartbeat-drbd模拟NFS高可用
查看>>
SQL Server性能调优:资源管理之内存管理篇(上)
查看>>
javaScript 基础知识
查看>>
接近开关,光耦
查看>>
基于visual Studio2013解决C语言竞赛题之1033数字交换
查看>>
给datalist加自动编号(解决博客的第XX楼)
查看>>
BZOJ3282: Tree (LCT模板)
查看>>
ES6中变量的解构赋值
查看>>
编译器C-Free V352注册算法分析
查看>>
数据绑定控件Reperter
查看>>
【codeforces】【比赛题解】#937 CF Round #467 (Div. 2)
查看>>