(5/31/16)Leetcode 154. Find Mini

2016-06-01  本文已影响0人  Flashpacker

Medium, 用时20分钟
出现了两处错误:
1.处理duplicates的方法没问题,仅需考虑尾部的duplicates即可,从而划归为153题(no duplicates)。
2.在去除尾部duplicates后需要再去除corner case(error1), 否则[1,2,1]无法test成功(去除duplicates后会出现顺序情况)
3.error2,bs的条件不能让pivot与nums[begin]相比,应该与nums[0]。

public class Solution {
    public int findMin(int[] nums) {
        //9:07
        //Eliminate some corner cases!
        int length = nums.length;
        if(length == 1) return nums[0];
        if(length == 2) return Math.min(nums[0], nums[1]);
        if(nums[0] < nums[length - 1]) return nums[0];
        
        int begin = 0, end = length-1;
        //remove duplicates in the tail!
        while (nums[end] == nums[0] && end > 0) {
            end --;
        }
        if(end == 0) return nums[0];
        //this is necessary(error1)
        if(nums[0] < nums[end]) return nums[0];
        
        while (begin < end) {
            int mid = (begin + end) / 2;
            int pivot = nums[mid];
            //必须是nums[0],不能是nums[begin]!与不同的bs不同(error2)
            if(pivot >= nums[0]) begin = mid + 1;
            else end = mid;
        }
        return nums[begin];
    }
}
上一篇下一篇

猜你喜欢

热点阅读