【算法训练-二分查找 三】【特殊二分】寻找峰值

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【数组的二分查找】,使用【数组】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为:目标公司+最近一年+出现频率排序,由高到低的去牛客TOP101去找,只有两个地方都出现过才做这道题(CodeTop本身汇聚了LeetCode的来源),确保刷的题都是高频要面试考的题。

【算法训练-二分查找 三】【特殊二分】寻找峰值_第1张图片
m明确标题后,附上题目链接,后期可以依据解题思路反复快速练习,题目按照题干的基本数据结构分类,且每个分类的第一篇必定是对基础数据结构的介绍

寻找峰值【MID】

峰值定义:其值严格大于左右相邻值的元素

题干

【算法训练-二分查找 三】【特殊二分】寻找峰值_第2张图片

解题思路

首先要注意题目条件,在题目描述中出现了 nums[-1] = nums[n] = -∞,这就代表着 只要数组中存在一个元素比相邻元素大,那么沿着它一定可以找到一个峰值

  • 查找时,左指针 l,右指针 r,以其保持左右顺序为循环条件
  • 根据左右指针计算中间位置 m,并比较 m 与 m+1 的值,如果 m 较大,则左侧存在峰值,r = m,如果 m + 1 较大,则右侧存在峰值,l = m + 1

两边都是负无穷,数组当中可能有很多波峰,也可能只有一个,中点所在地方,可能是某座山的山峰,山的下坡处,山的上坡处,如果是山峰,最后会二分终止也会找到,关键是我们的二分方向,并不知道山峰在我们左边还是右边,送你两个字你就明白了,爬山(没错,就是带你去爬山),如果你往下坡方向走,也许可能遇到新的山峰,但是也许是一个一直下降的坡,最后到边界。但是如果你往上坡方向走,就算最后一直上的边界,由于最边界是负无穷,所以就一定能找到山峰,总的一句话,往递增的方向上,二分,一定能找到,往递减的方向只是可能找到,也许没有

代码实现

给出代码实现基本档案

基本数据结构数组
辅助数据结构
算法二分查找
技巧

其中数据结构、算法和技巧分别来自:

  • 10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树
  • 10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法
  • 技巧:双指针、滑动窗口、中心扩散

当然包括但不限于以上

import java.util.*;


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

        // 2 定义左右指针
        int left = 0;
        int right = nums.length - 1;

        // 3 二分寻找峰值
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] < nums[mid + 1]) {
                // 3-1 左侧数较小,峰值存在于右侧
                left = mid + 1;
            } else if (nums[mid] > nums[mid + 1]) {
                // 3-2 右侧数较小,峰值存在于左侧
                right = mid;
            }
        }

        return left;
    }
}

复杂度分析

时间复杂度:O(log n),二分法最坏情况对n取2的对数
空间复杂度:O(1),常数级变量,无额外辅助空间

你可能感兴趣的:(#,二分查找,算法)