剑指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 }