Find Minimum in Rotated Sorted Array

来源:互联网 发布:淘宝搜什么能买到片 编辑:程序博客网 时间:2024/06/04 23:36

Suppose a sorted array is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

Find the minimum element.

You may assume no duplicate exists in the array.

思路:也是采用折半查找的方法,如果说刚好nums[mid]这个元素大于前一个元素并且小于后一个元素,直接返回即可。如果nums[mid]小于nums[right] 则说明在前一半,否则是在后一半。最后遍历肯定会出现left==right,直接返回nums[left]即可。

public class Solution {    public int findMin(int[] nums) {         int length=nums.length;    int left=0;    int right=length-1;    while(left<=right)    {        int mid=(left+right)/2;        if(nums[left]==nums[right]) return nums[left];        if(mid>=1 && mid<length-1&&nums[mid]<nums[mid-1] && nums[mid]<nums[mid+1]) return nums[mid];        else if(nums[mid]<nums[right]) right=mid-1;        else {            left=mid+1;        }    }    return nums[left];    }}

其实折半区间的时候,left不一定要等于mid+1,而right不一定要等于mid-1,因为万一此时的mid就是最小的数呢,注意最后遍历到最小数字的时候有right-left==1,但是也要注意当数组中只有一个元素的时候,或者整个数组就是升序,不进入循环,直接返回第一个元素,这就是最开始给mid赋值为left的原因。

public class Solution {    public int findMin(int[] nums) {        if(nums.length<=0) return 0;        int left=0;        int right=nums.length-1;        int mid=left;        while(nums[left]>nums[right])        {            if(right-left==1)             {   mid=right;                break;            }            mid=(left+right)/2;            if(nums[mid]<=nums[right])               right=mid;             if(nums[mid]>=nums[left])               left=mid;        }        return nums[mid];    }}
0 0