题解 | #寻找峰值#

寻找峰值

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

思路

该题并没有要求将全部的波峰找出,可以使用二分查找找到其中一个波峰即可 设置三个指针mid left right mid向左右比较,指向右边最大者时,更新左指针,反之则相反 直到左指针大于或者等于右指针时,就表明已经找到峰值结束循环返回。 不过有个毛病我很烦,就是当峰值处于边界时不太好判断,所以干脆直接硬编码了。如果有更好的优化思路,欢迎各位大佬提出来

代码

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型一维数组
     * @return int整型
     */
    public int findPeakElement (int[] nums) {
        // 代码健壮性检验
        if (nums == null) {
            return -1;
        }
        if (nums.length == 1) {
            return 0;
        }
        if (nums.length == 2) {
            return nums[0] > nums[1] ? 0 : 1;
        }
        // 定义三个指针
        int left = 0;
        int right = nums.length - 1;
        int mid = 0;

        // 对数组进行二分查找
        // 当左指针大于或者等于右指针时,就表明已经找到峰值了
        while (left < right) {
            // 计算中点的值
            mid = (left + right) / 2;

            // 校验边界峰值
            if (mid == 0) {
                return mid;
            }
            if (left == mid) {
                return right;
            }

            // 先让中点値处左右值互相比较
            if (nums[mid - 1] > nums[mid + 1]) {
                // 左值更大
                if (nums[mid] > nums[mid - 1]) {
                    // 如果中点値最大,则已经找到一个峰值,直接返回
                    return mid;
                } else {
                    // 反之,移动右指针到中点位置
                    right = mid;
                }
            } else {
                // 相同或者右值更大
                if (nums[mid] > nums[mid + 1]) {
                    // 如果中点値最大,则已经找到一个峰值,直接返回
                    return mid;
                } else {
                    // 反之,移动左指针到中点位置
                    left = mid;
                }
            }
        }
        return mid;
    }
}
全部评论

相关推荐

10-23 16:33
门头沟学院 Java
本人某中9本科,成绩中等,目前没科研没实习,目前后端学到了javaWeb,开始没定好方向,在学国外课程,走工程路线起步有点晚了,到这个时间点了还在学JavaWeb,顿感迷茫,不知道是坚持走下去还是寒假去准备考研。考研这个路弄得我还是心痒痒的,因为从众考研的人也不在少数,所以会有这方面的心理安慰吧,就是“不行我可以去考研啊”,而且意味着三年的缓冲,为了复试还有积攒经验美化简历,其实现在也可以去申入实验室打杂;就业可能意味着多些工作经验,工程岗应该到后面还是经验大于学历?还是有点迷茫了,求助好心人有无路线启发
千千倩倩:同27给点建议,现在这个时间点可以快速看完外卖和点评,不用跟着敲,但一定要在看的时候总结每个部分的整个业务流程,对其中的实现有一个大概的印象。然后直接开始看八股,刷算法。八股和算法最好还是在项目学习中穿插着看。如果计算机基础,算法这些基础好,加上每天刻苦学习,两周可以达到勉强能面试的水平,到时候就直接海投中小厂,在约面和面试的过程中不断巩固知识。没找到实习也没关系,就当积累经验。再沉淀一波直接明年三月开始投暑期,毕竟是9本,总是有面试机会的,只要你这三个月不懈怠,面试发挥得一定不错,只要拿到一个中,大厂暑期实习,秋招就有竞争力了。总得而言,现在还有机会,但是时间非常紧张,需要你结合自己情况考虑,共勉
你会选择考研还是直接就业
点赞 评论 收藏
分享
挥毫自在:想白嫖你呢
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务