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