旋转数组的最小数字

来源:互联网 发布:两台台式机共享网络 编辑:程序博客网 时间:2024/06/05 20:04

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}{1,2,3,4,5}的一个旋转,该数组的最小值为1

该题为剑指offer中面试题8。思路是使用二分查找

需要考虑的两个点:

1.如果旋转的元素为0,即该数组是一个递增(非递减)怎么办

2.如果数组left,right,mid三个元素相等,无法用二分查找,所以改用顺序查找。



package cn.array.rotate;public class Demo1 {public static void main(String[] args) {int[] a1 = {1,0,1,1,1};System.out.println(min(a1));}public static int min(int[] arr) {if (arr == null || arr.length == 0)throw new RuntimeException("数组不能为空");// 如果arr[0]<arr[arr.length-1],说明该数组完全有序,旋转的元素个数为0if (arr.length == 1 || arr[0] < arr[arr.length - 1])return arr[0];return min(arr, 0, arr.length - 1);}private static int min(int[] arr, int left, int right) {if (right - left == 1)return arr[right];int mid = left + (right - left) / 2;if (arr[left] > arr[mid])return min(arr, left, mid);else if(arr[left] < arr[mid])return min(arr, mid, right);//当左中两个元素相同时,要判断最右的元素大小//因为前面限制条件,最后的元素元素只能小等于arr[left]else{if(arr[right]<arr[left])return min(arr,mid,right);else//左中右三个元素相同,无法用二分查找,只能顺序查找return sequence(arr,left,right);}}//顺序查找private static int sequence(int[] arr, int left, int right) {int min=arr[left];for(int i=left+1;i<=right;i++)if(arr[i]<min)min=arr[i];return min;}}





0 0
原创粉丝点击