旋转数组的最小数字

题目:把一个数组最开始的若干元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如:数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转数组。此时的旋转数组是可以划分为两个排序的子数组。最小值为这两个子数组分界线。

思路:写一个函数minArrary(int*arrary int len),返回值为int。定义三个指针left=mid=0(如果数组是将前面的0个元素放到数组的后面,那么旋转数组即是原数组,最小值即为mid(left)处的值),right,并且初始化。分别指向数组的头,中,尾部。如果数组的长度小于等于0或者arrary为空,则抛异常为空。如果当满足array[left]>array[right]时,如果right-left==1,mid=right;break;mid=(right+left);如果array[left]==arrary[right],arrary[left]==array[mid],只能顺序查找。int min=array[left],当满足计数变量i<right 时候,比较array[i]与min的值,将较小的值赋值给min,这个时候的时间复杂度为O(n)。如果arrary[mid]>arrary[left],则有left=mid;如果有arrary[mid]<arrary[right],则有right=mid;返回mid处的值。

#include<iostream>
#include<stdio.h>
#include<string>
using namespace std; int array[1000001];
//求旋转数组最小值
int MInArray(int *array,int n){
int left = 0;
int right = n - 1;
int mid = 0;
//二分查找最小值
while(array[left] >= array[right]){
//如果相邻right下标为最小值
if(right - left == 1){
mid = right;
break;
}
mid = (left + right) / 2;
//如果下标为left,right,mid的数值相等,只能顺序查找
if(array[left] == array[right] && array[left] == array[mid]){
int min = array[left];
//顺序查找最小值
for(int i = left + 1;i <= right;i++){
if(min > array[i]){
min = array[i];
}
}
return min;
}
//mid 处于第一递增排序序列 最小值在mid后面
if(array[mid] >= array[left]){
left = mid;
}
//mid 处于第二递增排序序列 最小值在mid前面
else if(array[mid] <= array[right]){
right = mid;
}
}
return array[mid];
} int main()
{
int i,n;
while(scanf("%d",&n) != EOF){
for(i = 0;i < n;i++){
scanf("%d",&array[i]);
}
printf("%d\n",MInArray(array,n));
}
return 0;
}

java代码:

public class RotatingArray {
public int rotateArray(int a[]){
int left=0;
int mid=0;
int right=a.length-1;
while(a[left]>=a[right]){
if((right-left)==1){
mid=right;
break;
}
mid=(left+right)/2;
if(a[left]==a[mid]&&a[mid]==a[right]){
//只能用顺序查找最小值
int min=a[left];
for(int i=left;i<=right;i++){
if(a[i]<min)
min=a[i];
}
return min; }
if(a[mid]>=a[left])
left=mid;
else if(a[mid]<=a[left])
right=mid;
}
return a[mid];
}
public static void main(String[] args){
int[] a={4,5,6,1,2,3};
RotatingArray ra=new RotatingArray();
int min=ra.rotateArray(a);
System.out.println(min+" ");
}
}

剑指offer—第二章算法之二分查找(旋转数组的最小值)的更多相关文章

  1. 剑指offer—第二章算法之快速排序

    算法:排序和查找(二分查找,归并排序,快速排序),位运算等. 查找:顺序查找,哈希查找,二叉排序树查找,哈希表. 二分查找可以解决:"旋转数组中的最小数字","数字在排序 ...

  2. 剑指offer第二章

    剑指offer第二章 1.二维数组中的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含 ...

  3. 剑指offer第二版面试题3:二维数组中的查找(JAVA版)

    题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 1 2 8 9 2 4 ...

  4. 《剑指offer(第二版)》面试题55——判断是否为平衡二叉树

    一.题目大意 输入一颗二叉树,判断该二叉树是否为平衡二叉树(AVL树). 二.题解 <剑指offer>上给出了两种解决方式: 1.第一种是从根节点开始,从上往下遍历每个子节点并计算以子节点 ...

  5. 剑指Offer(三十二):把数组排成最小的数

    剑指Offer(三十二):把数组排成最小的数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/b ...

  6. 《剑指offer 第二版》题解

    剑指Offer 按题号排序 面试题 3:数组中重复的数字 面试题 4:二维数组中的查找 面试题 5:替换空格 面试题 6:从头到尾打印链表 面试题 7:重建二叉树 面试题 8:二叉树的下一个节点 面试 ...

  7. 经典面试题目——找到第n个丑数(参考《剑指offer(第二版)》面试题49)

    一.题目大意 给你一个数n,要求返回第n个丑数.其中,丑数的定义如下: 丑数是指只包含因子2.3和5的数.(数字1也是丑数,不过是个特例)引用<剑指offer>上的话来说,对于一个数M,如 ...

  8. 《剑指offer(第二版)》——面试题36:二叉搜索树与双向链表

    具体的题目大意和参考思路在此处不详述(见<剑指offer>),实质就是在中序遍历的过程中调整指针的指向,关于中序遍历有递归和非递归两种操作,所以此处也用了两种方法. 方法1(递归法): 代 ...

  9. 《剑指offer(第二版)》面试题60——n个骰子的点数

    一.题目描述 把n个骰子仍在地上,所有的骰子朝上的一面的点数之和为s,输入n,打印出s所有可能的值出现的概率. 二.题解 <剑指offer>上给出的两种方法,尤其是代码,晦涩难懂且没有注释 ...

随机推荐

  1. HDU 1116 || POJ 1386 || ZOJ 2016 Play on Words (欧拉回路+并查集)

    题目链接 题意 : 有很多门,每个门上有很多磁盘,每个盘上一个单词,必须重新排列磁盘使得每个单词的第一个字母与前一个单词的最后一个字母相同.给你一组单词问能不能排成上述形式. 思路 :把每个单词看成有 ...

  2. MongoDB的安装,配置与开机自启动

    关于简介不多说百度去吧少年.. MongoDB详细安装: 1.进入官网,点击DOWNLOAD MONGODB,下载所需要的版本.. 我这里把下载的文件放在d\MongoDB文件夹下,点击下载的官方镜像 ...

  3. 深入理解Windows X64调试

    随着64位操作系统的普及,都开始大力进军x64,X64下的调试机制也发生了改变,与x86相比,添加了许多自己的新特性,之前学习了Windows x64的调试机制,这里本着“拿来主义”的原则与大家分享. ...

  4. html + css + js注释规范

    添加注释到代码中,是一个很好的习惯,而且极大的提高了代码的可读性 1.HTML <!--commentContent--> 2.CSS //commentContent /*comment ...

  5. mysql使用过程中碰到的问题

    start job failed to start mysql ubuntu 原因时我将var整个目录的组权限设置为www-data了, 试了网上的办法都不行(有个妥协方法是重新安装, 但很不好), ...

  6. [软件]XAMPP错误解决

    // 错误1  (在运行安装包时候出现) // 错误2 1. 找到这个文件 这个文件  要将 config.inc.php 中 $cfg['Servers'][$i]['host'] = ’local ...

  7. 网页爬虫的设计与实现(Java版)

    网页爬虫的设计与实现(Java版)     最近为了练手而且对网页爬虫也挺感兴趣,决定自己写一个网页爬虫程序. 首先看看爬虫都应该有哪些功能. 内容来自(http://www.ibm.com/deve ...

  8. 15_采用Pull解析器解析和生成XML内容

    java还提供SAX和DOM用于解析XML Android还集成了Pull解析器——推荐 package cn.itcast.service; import java.io.InputStream; ...

  9. 使用VNC远程连接Windows Azure Linux虚拟机

    本文以Oracle Linux 6.4虚拟机为示例 一. 安装 tigervnc-server 使用“rpm -qa vnc”指令查看是否安装vnc服务,如果没有安装,则可以使用yum或者rpm进行安 ...

  10. php面向对象(一) 初窥

    初窥php面向对象 1.类:类就是属性和方法的集合 是一个抽象的概念比如生活中的“人”,"汽车"2.对象:对象是具体的事物 比如一叫“小强”的人 一辆叫“奥迪a7”的汽车3.类和对 ...