6 旋转数组的最小数字

 

题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
 
 
 

 思路:

旋转之后的数组可以看成是2个排序的子数组,而且前面的子数组的元素都大于或者等于后面的子数组。


我们用2个指针分别指向第一个数组的第一个元素,和 第二个数组的最后一个元素。2个指针记为left, right .

中间元素 记为mid mid=left+(left-right)/2

如果left<mid (34512) 说明 mid 在第一个子数组里,令left=mid 继续查找
如果right>mid (45123) 说明 mid 在第二个子数组里,令 right= mid 继续查找

终止条件 :当2个指针的距离是1的时候,表明第一个指针已经指向了第一个递增子数组的末尾,而第二个指向了第二个递增子数组的开头。

 

 

 

特殊情况 【1 1 1 0 1】 
mid left right 相等 顺序查找


 1 import java.util.ArrayList;
 2 public class Solution {
 3     public int minNumberInRotateArray(int [] a) {
 4         if(a.length==0) return 0 ;
 5         int left = 0,right = a.length-1,mid=0;
 6         while(a[left]>=a[right]){
 7             if(right-left==1) return a[right];
 8             
 9             mid = left +(right-left)/2;
10            // 特殊处理[1 1 1 0 1]
11             // code
12             if((a[mid]==a[right])&&(a[mid]==a[left]))
13                 return find_min(a,left,right);
14             //
15             if(a[left]<=a[mid]) left =mid;
16             if(a[right]>=a[mid])right = mid;
17         }
18         return a[mid];
19     }
20     private int find_min(int[] a,int left,int right){
21         int min = a[left];
22         for(int i =left;i<=right;i++)
23             if(a[i]<min) 
24                 min =a[i];
25         return min;
26     }
27 }

 

 1 # -*- coding:utf-8 -*-
 2 class Solution:
 3     def minNumberInRotateArray(self,a):
 4         # write code here
 5         def mymin(a):
 6             m = a[0]
 7             for i in a:
 8                 if(i<m):
 9                     m = i
10             return m
11         left = 0
12         right = len(a)-1
13         while(a[left]>=a[right]):
14             if(right-left==1):
15                 return a[right]
16             mid = left + int((right - left)/2) 
17             if(a[mid]==a[right] and a[mid]==a[left]):
18                 return mymin(a)
19             if(a[left]<=a[mid]):
20                 left = mid
21             if(a[right]>=a[mid]):
22                 right = mid
23         return a[mid]

 

c++:20180807
 1 class Solution {
 2 public:
 3     int minNumberInRotateArray(vector<int> a) {
 4          int lo = 0;
 5          int hi = a.size()-1;
 6          int mid = 0;
 7          while(a[lo]>=a[hi]){
 8              if(hi - mid==1)
 9                  return a[hi];
10             mid = lo +(hi-lo)/2;
11              if(a[mid]==a[hi]&&a[mid]==a[lo])
12                  return findMin(a);
13              
14              if(a[lo]<=a[mid])
15                  lo = mid;
16              if(a[hi]>=a[mid])
17                  hi = mid;
18          }
19         return 1;
20     }
21     int findMin(std::vector<int> v){
22         int m = v[0];
23         for(int i=1;i<v.size();i++)
24             if(m<v[i])
25                 m=v[i];
26         return m;
27     }
28 };

 

posted @ 2017-11-05 14:22  乐乐章  阅读(203)  评论(0编辑  收藏  举报