什么是旋转数组
比如:
{4,5,6,1,2,3},{3,4,5,6,1,2}是{1,2,3,4,5,6}的旋转数组
代码
package com.tangbaobao.offer;
import org.junit.jupiter.api.Test;
/**
* 旋转数组中的最小数字
*
* @author 唐学俊
* @create 2018/04/03
**/
public class Test11 {
@Test
public void fun1() {
int[] arr = {1, 0, 1, 1, 1};
int min = this.getMin(arr);
System.out.println(min);
}
/**
* 查找旋转数组中最小的数字
* 4561233
*
* @param arr
* @return
*/
public int getMin(int[] arr) {
//定义两个指针,一个指向最前面
int start = 0;
int end = arr.length - 1;
int mid = start;
while (arr[start] >= arr[end]) {
if (end - start == 1) {
mid = end;
break;
}
//定义一个中间数字
mid = (start + end) / 2;
//如果start,end,mid相同则采用顺序查找
if (arr[start] == arr[mid] && arr[start] == arr[end]) {
return this.serialSearch(arr, start, end);
}
//比第一个大,则属于大数组中的
if (arr[mid] >= arr[start]) {
start = mid;
//比最后一个小,属于小数组中的
} else if (arr[mid] <= arr[end]) {
end = mid;
}
}
return arr[mid];
}
/**
* 顺序查找
*
* @param arr
* @param start
* @param end
* @return
*/
private int serialSearch(int[] arr, int start, int end) {
int min = arr[start];
while (start < end) {
if (min > arr[start]) {
min = arr[start];
}
start++;
}
return min;
}
}