1.没什么好说的直接排序,输出最小值就完了。暴力直接,有api不用是傻瓜。
public int minNumberInRotateArray(int[] array) {
//直接排序
if (array.length == 0) return 0;
Arrays.sort(array);
return array[0];
}
2.站在学习的角度上
理解题意:非递减数组的一个旋转数组,作为参数。
那么传入的参数格式要么是:
1.递增数组经过数组旋转之后得到的
2.不递增也不递减
第一种情况:
这种偏向于有序的数组,找值的题一般是利用二分思想,但是对于二分来说,第一他没有target,第二数组并不是真正的有序。逐一分析。
确定target,一般是端点,要么是左端点,要么是右端点。左端点和mid去比较,可以发现好像并没有什么用,如果mid>low,那么可以说明mid前面的值是想要的嘛?好像不行。右端点,如果是右端点,好像还可以,因为此时mid位置元素和low位置,或者high位置比较。
1.mid>low元素,说明mid处在递增数组中,那么low=mid+1
2.mid<high元素,说明mid处在旋转后的数组中high=mid
3.还有一种情况就是mid<=low,而且mid>high
eg:
这个时候说明来到了旋转产生的边界处,只需要low++即可。
第二种情况:
根据上边的,mid>=low,而且mid!<high,无法判断在那个区间内,此时low++,但是下次的mid会等于
跳过正确的0值,所以这种情况下,如果low的值,小于high的值,直接返回即可。
public static int minNumberInRotateArray1(int[] array) {
if (array.length == 0) return 0;
//二分法 没有target 因为是非递减数组的旋转数组,那么构造一定是类似与{3, 4, 5, 1, 2};或者{1,0,1,1,1}
//则一定要比较的是mid在那个区间,就是找到旋转的边界
int right = array.length - 1;
int left = 0;
int mid = 0;
while (right > left) {
if (array[left]<array[right]){
return array[left];
}
mid=(left+right)/2;
if (array[mid] < array[right]) {
right = mid;
} else if (array[mid] > array[left]) {
left = mid + 1;
} else {
left++;
}
}
return array[left];
}