把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
题目的意思很清楚,就是在一个可以翻转的数组中找寻到我们的最小数字。一眼就可以想到是二分法,但是怎么个二分呢。刚开始分析了1 2 3 4 5的所有情况,但是发现这些情况没办法一一判断,而且如果出现00010的情况,二分法也没办法去分,题目说的是非递减,递增的大小可以为0。这个时候只能挨个遍历获取。挨个遍历之后呢,此时使用二分,只要大于后面就往后移动,可以知道小的在后面,只要大于前面就往前移动,记住往小的一遍挪即可。
代码
public int minNumberInRotateArray(int[] array) { if (array == null) return 0; int l = 0; int r = array.length - 1; while (l <= r) { int m = l + (r - l) / 2; // 找出中点 // 如果大于前,也大于后 if (array[m] == array[l] && array[m] == array[r]) { // 只能采用遍历取最小 int min = Integer.MAX_VALUE; for (int num : array) { min = Math.min(min,num); } return min; } // 否则采用二分法判断向前还是向后 if (array[m] > array[r]) { l = m + 1;// 向后 } else { r = m; // 向前 } } return 0; }
很久之前写的题目了,今天再写可能是脑子里面还是有之前的印象吧,总想与它对着来,但是最后还是没能逃脱,终究还是那样了。
Keep thinking, keep coding!