您的位置:首页 > Web前端

剑指offer-旋转数组的最小数字-二分查找法

2017-06-19 08:59 525 查看
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

public class Solution {
public int minNumberInRotateArray(int [] array)
{
if(array == null || array.length == 0)
{
return 0;
}
int p1 = 0;//从前往后走
int p2 = array.length-1;//从后往前走
int min = array[p1];//如果没发生旋转,直接将array[0]的值返回,
int mid = 0;
//当数组发生旋转了,
while(array[p1] >= array[p2])
{
//当两个指针走到挨着的位置时,p2就是最小数了
if(p2 - p1 == 1)
{
min = array[p2];
break;
}
mid = (p1 + p2)/2;
//如果中间位置的数既等于p1位置的数又等于P2位置的数
if(array[p1] == array[mid]&&array[p2]==array[mid])
{
min = minInorder(array,p1,p2);
}
if(array[p1] <= array[mid])//若中间位置的数位于数组1,让p1走到mid的位置
{
p1 = mid;
}
else if(array[p2] >= array[mid])//若中间位置的数位于数组2,让p2走到mid的位置
{
p2 = mid;
}
}
return min;
}
private int minInorder(int[]array,int p1,int p2)
{
int min = array[p1];
for (int i = p1 + 1; i <= p2; i++)
{
if(min > array[i])
{
min = array[i];
}
}
return min;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: