来自" leetcode162"的挑战找到峰值元素。为什么这种情况无法通过?

时间:2017-11-25 01:20:16

标签: algorithm binary-search

我的代码如下。我使用二进制搜索来解决问题。 38/58测试用例可以通过,但这不能通过任何方式: [3,4,3,2,1],我在纸上计算了,过程如下: 端= 4,中等= 0 +(4-0)/ 2 = 2,开始= 2。 但在上面的例子中,start应为1。

我不知道如何修改我的代码。

class Solution {
    public int findPeakElement(int[] nums) {
        if (nums.length == 0 ||nums.length == 1) {
            return 0;
        }

        int start = 0;
        int end = nums.length - 1;
        int mid;

        //binary search
        while (start + 1 < end) {
            mid = start + (end - start) / 2;
            if (nums[start] < nums[start + 1]) {
                start = mid;
            }
            else {
                end = mid;
            }
        }
        System.out.println ("start=" + start);
        System.out.println ("end=" + end);
        System.out.println ("nums[start]=" + nums[start]);
        System.out.println ("nums[end]=" + nums[end]);

        if (nums[start] < nums[end]) {
            return end;
        }
        else {
            return start;
        }

    }
}

2 个答案:

答案 0 :(得分:0)

你应该改变

nums[start] < nums[start + 1]

nums[mid] < nums[mid + 1]

但是,您的算法只有在阵列出现时才会起作用。正在急剧增加和减少。

mid = start + (end - start) / 2;

完全相同
mid = (start + end) / 2;

所以我觉得它更好更简单

答案 1 :(得分:0)

您的解决方案有点复杂,这是一个更简洁的解决方案。如果你逐行去,你会发现它需要的支票比你想象的要少。

mid非常棘手,但如果startend设置正确,则无需添加起始值。

class Solution {
    public int findPeakElement(int[] nums) {
        if (nums.length <=  1){
            return 0;
        }

        int start = 0;
        int end = nums.length - 1;
        int mid = 0;

        //binary search
        while (start < end) {
            mid = (start + end) / 2;

            if (nums[mid]  > nums[mid + 1]) {
                end = mid;
            }
            else if (nums[mid] < nums[mid + 1]) {
                start = mid+1;
            }
        }
        return start;
}
}