寻找峰值[抽象二分练习]

前言

不是死知识点的考察,这种题就很有难度,慢慢推出来也很有意思。这种题有抽象二分/贪心算法脑筋急转弯型。

一、寻找峰值

在这里插入图片描述

二、抽象二分

	public int findPeakElement(int[] nums) {
        // 一定存在峰值,说明不存在连续递增的情况,这和logN有什么联系?
        int low = 0,high = nums.length - 1;

        while(low < high){
            int mid = low + (high - low >>> 1);
            int midVal = nums[mid];
            // 右边必有峰值。
            if(midVal < nums[high]) low = mid + 1;
            // 左边必有峰值。
            else if(midVal < nums[low])high = mid - 1;
            // nums[low] <= midVal >= nums[high]
            /* 让high--,如果high是峰值,则必有比nums[high - 1] < nums[high],
            而且nums[low] <= midVal,则nums[high - 1]之前必有峰值。
            */
            else --high;

        }
        return low;
    }

总结

1)对于这种有难度/有巧劲的题,需要多理解题目的描述,挖挖里面的条件,找找和已学数据结构与算法的联系。如果不沉下心来利用已知条件分析,就会一点思路都没有,实在没有就看看题解,说明题练少了,看几个月也想不出来,浪费时间!
2)这种没有固定公式,在草稿纸上多举举例子,模拟模拟,找找规律和感觉,再运用数据结构把它表达出来,最后review慢慢沉淀一点套路。
3)最重要的还是多做做这类题目,多看看这类优秀的题解,开阔以下视野,分析起来才更加流畅,才能慢慢举一反三。

参考文献

[1] LeetCode 寻找峰值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值