题解 | #寻找峰值#

寻找峰值

http://www.nowcoder.com/practice/fcf87540c4f347bcb4cf720b5b350c76

递归实现,代码简洁。

思路:

取中间值mid与其右边的值比较,如果比他小,那对与mid来说,距离他最近的峰值必定在其右侧区间;反之则在其左侧区间。

重复划分之后,最后数组中只剩下一个元素,那这个元素必定是其附近的一个峰值。

可以逆着想象一下,是如何到达只剩下一个元素的,假如前一步是剩下2个元素的数组,那一定是大的那个元素留下了。

再往前推一步,假如是4个元素的数组,比较的是中间两个元素,剩下的是大的元素所在区间。

比如数组[1,2,3,4],第一次比较2和3,进入[3,4];再次比较后进入[4]。



public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return int整型
     */
     public int findPeakElement(int[] nums) {
        if (nums == null) {
            return -1;
        }
        return binaryFindPeakElement(nums, 0, nums.length - 1);
    }

    /**
     * @param nums  数组
     * @param left  左边界
     * @param right 有边界
     * @return 数组中的某一个峰值
     */
    private static int binaryFindPeakElement(int[] nums, int left, int right) {
        if (left == right) {
            return left;
        }
        int mid = (left + right) / 2;
        return nums[mid] < nums[mid + 1] ? binaryFindPeakElement(nums, mid + 1, right) : binaryFindPeakElement(nums, left, mid);
    }
}
全部评论

相关推荐

10-27 17:26
东北大学 Java
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务