旋转数组的最小数字-用二分法的变形解决(虽然多此一举)
下边将是我的代码(超级无敌完整版)
看图结合代码想比较好想,注意除特殊情况外最小值总在无序的那侧哦~
代码如下:
package 递归基础小题;
/**
* @author 邓雪松 (づ ̄ 3 ̄)づ)
* @create 2021-10-26-17-14
*/
public class Case01_旋转数组的最小数字 {
static int min(int[] arr){
int begin = 0;
int end = arr.length - 1;
//考虑没有旋转这种特殊的旋转
if(arr[begin]<arr[end])
return arr[begin];
//注意是begin+1<end 与 return arr[end]相对应
//也就是begin+1=end时退出->begin与end是相邻元素,退出
while(begin+1<end){
int mid = begin + ((end-begin)>>1);
//如果mid元素与begin元素和end元素都相等 如1,0,1,1,1 如果还用这种二分的变种方法那么就错了呀,这也是这种解法的bug
//所以当遇见这种情况的时候就用普通方法找就好了
if(arr[begin]==arr[mid]&&arr[begin]==arr[end]){
arr[end] = pt(arr);
break;
}
// 要么左侧有序,要么右侧有序
if(arr[mid]>=arr[begin]){ //左侧有序
begin = mid;
}else{
end = mid;
}
}
return arr[end];
}
static int pt(int[] arr){
int min = arr[0];
for (int i = 1; i < arr.length; i++) {
if(arr[i]<min)
min = arr[i];
}
return min;
}
public static void main(String[] args) {
int[] arr = {2,3,4,5,1};
int res = min(arr);
System.out.println(res);
int[] arr2 = {1,0,1,1,1};
int min = min(arr2);
System.out.println(min);
}
}
运行结果如下:
1
0
完 ~