牛客网剑指offer_18题
分析
分析:
①二分法做题
②选择最大索引为target,最小值不行。再选择最小索引low=0和中间索引mid=target/2
③对每一步二分进行循环,循环的终止就是mid==low
④在循环中将mid与targe的【值!】t比较分为三种情况:
a.array[target] > array[mid] 可以判断最小值在low-mid之间 重新修改mid和target
b.array[target] < array[mid] 可以判断最小值在mid-target之间 重新修改mid和low
c.array[target] == array[mid] 无法判断在哪边,需要在【low,target】之间遍历找到最小值
⑤在循环结束后,判断low和target索引所在的值哪个最小,即为所求。
代码与解析
package com.offer;
import java.util.ArrayList;
public class JZ6 {
public int minNumberInRotateArray(int [] array) {
if(array.length==0)
return 0;
int target =array.length-1;
int mid = (array.length-1)/2;
int low = 0;
while(low!=mid) {
if (array[target] > array[mid]) {
target = mid;
mid = target / 2;
} else if (array[target] < array[mid]) {
low = mid;
mid = mid + (target - mid) / 2;
} else {
int min = Integer.MAX_VALUE;
for (int i = low; i <= target; i++) {
if (array[i] < min)
min = array[i];
}
return min;
}
}
return (array[target]>array[low])?array[low]:array[target];
}
public static void main(String[] args) {
int[] arr = {4,5,6,2,3};
int[] arr1 = {4,4,4,4,4};
JZ6 jz6 = new JZ6();
System.out.println(jz6.minNumberInRotateArray(arr));
System.out.println(jz6.minNumberInRotateArray(arr1));
}
}