剑指offer【06】- 旋转数组的最小数字(java)

题目:旋转数组的最小数字

考点:查找和排序

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

 

法一:利用Arrays.sort()排序

 1 import java.util.ArrayList;
 2 import java.util.Arrays;
 3 public class Solution {
 4     public int minNumberInRotateArray(int [] array) {
 5         //数组为空时
 6         if(array.length == 0){
 7             return 0;
 8         }
 9         //升序排序
10         Arrays.sort(array);
11         return array[0];
12     }
13 }

 

法二:分情况讨论

1.数组为空
2.部分旋转,例如由(1,2,3,4,5)旋转为(3,4,5,1,2),此时只需要遍历数组,找到当前数比前面的数小的数即可。
3.完全旋转,例如由(1,2,3,4,5)旋转为(1,2,3,4,5),此时第一个数最小。
 1 import java.util.ArrayList;
 2 import java.util.Arrays;
 3 public class Solution {
 4     public int minNumberInRotateArray(int [] array) {
 5         //数组为空时
 6         if(array.length == 0){
 7             return 0;
 8         }
 9         if(array.length == 1){
10             return array[0];
11         }
12         //前部分数据旋转
13         for(int i = 0; i < array.length - 1; i++){
14             if(array[i] > array[i+1]){
15                 return array[i+1];
16             }
17         }
18         //全部数据旋转,相当于没有旋转
19         return array[0];
20     }
21 }

 

法三:二分法

 1 import java.util.ArrayList;
 2 import java.util.Arrays;
 3 public class Solution {
 4     public int minNumberInRotateArray(int [] array) {
 5         if (array.length == 0){
 6             return 0;
 7         } 
 8         int left = 0;
 9         int right = array.length - 1;
10         int middle = 0;
11         while (array[left]>=array[right]) {
12             //数组长度等于2时
13             if(right-left==1){
14                 middle = right;
15                 break;
16             }
17             middle = left + (right - left) / 2;
18             if (array[middle] >= array[left]) {
19                 left = middle;
20             }
21             if (array[middle] <= array[right]) {
22                 right = middle;
23             }
24         }
25         return array[middle];
26     }
27 }

 

 

posted @ 2019-03-24 21:35  [浪子回头]  阅读(164)  评论(0编辑  收藏  举报