旋转数组的最小数字

题目:把一个数组最开始的若干元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如:数组{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+" ");
}
}

最新文章

  1. Redis数据结构详解之Set(三)
  2. Node.js Stream-基础篇
  3. 第3.2 使用案例1:股票期货stock portfolio 21050917
  4. debian8 Apache 更改根目录
  5. 博文写作——摘要&amp;摘要图标
  6. JS运动从入门到兴奋1
  7. Leetcode 179 Largest Number 贪心
  8. linq 和 , 并 , 差 ,交
  9. svn钩子(hooks)
  10. 管理员必须掌握的八个cmd命令
  11. js构造函数传参
  12. 【欧拉函数】【HDU1286】 找新朋友
  13. 找出诡异的Bug:数据怎么存不进去
  14. gulp基于node流的自动化构建工具
  15. Core官方DI解析(3)-ServiceCallSite.md
  16. DDoS攻击及防御措施
  17. JQUERY-修改-API-事件绑定
  18. 四、K8S
  19. activity之间的数据传递方法
  20. 误删文件不用怕 grep命令帮你恢复

热门文章

  1. poj 3328(多起点多终点的最短路)
  2. http://my.oschina.net/u/719192/blog/506062?p={{page}}
  3. PHP Simple HTML DOM解析器
  4. lintcode:买卖股票的最佳时机 I
  5. RTP-实时协议
  6. iOS复杂动画之抽丝剥茧(Objective-C &amp; Swift)
  7. HttpClient使用详解(转)
  8. IOS系统中使用zepto的live事件绑定不了的一个办法
  9. 神经网络:卷积神经网络CNN
  10. HDU 2852 KiKi&#39;s K-Number 树状数组 + 二分