题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出一个旋转数组的最小元素。
例如: {3,4,5,1,2} 为 {1,2,3,4,5} 对应的一个旋转数组,该数组的最小元素为 1 。
分析:
方法一:
因为数组的原数组是一个递增数组,所以从头遍历数组,出现 a[i] 小于 a[i-1] 则说明找到了最小元素,为 a[i]。
1 int FindMinNumber(int arr[],int length){ // arr为旋转数组,length为数组长度 2 for(int i=1;i<length;i++){ 3 if(arr[i]<arr[i-1]) 4 return arr[i] ; // 找到了最小元素 5 } 6 return -1 ; // 未找到,返回 -1 7 }
方法二:
采用二分查找,两个指针分别指向旋转数组的首元素(p1)和尾元素(p2) ,比较两指针中间元素(midNum)与两端元素的大小。
如果 p1 大于 midNum 则说明 p1到midNum之间的元素没有移动过,最小元素在另一半,p1指向midNum 。
如果 p1 小于 midNum 则说明 p1到midNum之间的元素发生了改变,最小元素在其中, p2指向midNum 。
p2同理。
直至最后p1等于p2,则找到最小元素。
1 int FindMinNumber2(int arr[],int length){ 2 int p1 = 0 ; 3 int p2 = length-1 ; 4 int mid = (p1+p2)/2 ; 5 while(p1!=p2){ 6 if(arr[p1]>arr[mid]) 7 { 8 p2 = mid ; 9 } 10 if(arr[p2]<arr[mid]){ 11 p1 = mid ; 12 } 13 } 14 return arr[p1] ; 15 }
时间: 2024-10-11 00:49:28