您的位置:首页 > 其它

题目:寻找旋转排序数组中的最小值 II

2015-09-23 23:43 176 查看


假设一个旋转排序的数组其起始位置是未知的(比如0 1 2 4 5 6 7 可能变成是4 5 6 7 0 1 2)。

你需要找到其中最小的元素。

数组中可能存在重复的元素。

您在真实的面试中是否遇到过这个题?
Yes

样例

给出[4,4,5,6,7,0,1,2] 返回 0

标签 Expand

相关题目 Expand
/article/3677883.html
解题思路:
有序的旋转数组前半部分和后半部分都是递增的序列。数组第一个元素要大于等于最后一个元素。否则数组本身就是个递增的序列,第一个元素就是最小数

如果不是递增序列,则取中间数。

1.如果中间数大于数组的第一个元素,说明最小数存在后半段,范围缩小到中间数到最后一个元素左开右闭区间

2.如果中间数小于数组的第一个元素,说明最小数存在前半段,范围缩小到第一个元素和中间数闭区间左开右闭区间。

3.如果中间数等于数组第一个元素,需要特殊处理。

3.1 如果中间数大于数组最后一个元素,说明最小数存在后半段, 范围缩小到中间数到最后一个元素左开右闭区间

3.2 如果中间数等于数组最后一个元素,则需分别找出这第一个元素到中间数,和中间数到最后一个元素这两个区间的最小数,然后对这两个最小数进行比较,最后取最小值。
3.3 如果中间数小于数组的最后一个元素,说明第一个元素也小于最后一个元素直接会返回如代码中的判断1,故不需要判断。
public class Solution {
/**
* @param num: a rotated sorted array
* @return: the minimum number in the array
*/
public int findMin(int[] num) {
// write your code here
return  findMin(num, 0, num.length-1);
}

public  int  findMin(int[] num ,int left ,int right){
if(num[left]<num[right]||left==right){
return num[left];
}
int mid = (left+right)/2;
if(num[mid]>num[left]){
return findMin(num, mid+1, right);
}else if(num[mid]<num[left]){
return findMin(num, left, mid);
}else{
if(num[mid]>num[right])
return findMin(num, mid+1, right);
else
return Math.min(findMin(num, left, mid), findMin(num, mid+1, right));
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: