描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
解题思路
暴力排序 时间复杂度O(nlogn) ,空间复杂度O(1)
- 顾名思义,排序后输出最小的值即可
假设[1,2,3,4,5]旋转后为[3,4,5,1,2], 排序后为[1,2,3,4,5],则 array[0]即为最小值
public int minNumberInRotateArray(int [] array) { if (array.length == 0){ return 0; } // 排序 Arrays.sort(array); // 输出最小的 return array[0]; }
优化方法 时间复杂度O(n),空间复杂度O(1)
由题意给出的数组是一个非递减排序, 把一个数组最开始的若干个元素搬到数组的末尾,旋转后会破坏数组的非递减排序,会使数组的最大值在数组最小值之前,即会出现arr[i] > arr[i+1],那么arr[i+1]即我们要找的最小值,利用这个特性可以得到以下代码
public int minNumberInRotateArray(int [] array) { if (array.length == 0){ return 0; } for (int i = 1 ; i < array.length ; i++){ // 只要出现array[i-1] > array[i]就可以确认array[i]为要找的数 if (array[i-1] > array[i]){ return array[i]; } } return array[0]; }
举例
假设[1,2,3,4,5]旋转后为[3,4,5,1,2], 当满足array[i]>array[i+1]即5>1,所以输出array[i+1]即1