废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【数组的二分查找】,使用【数组】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为:目标公司+最近一年+出现频率排序,由高到低的去牛客TOP101去找,只有两个地方都出现过才做这道题(CodeTop本身汇聚了LeetCode的来源),确保刷的题都是高频要面试考的题。
m明确标题后,附上题目链接,后期可以依据解题思路反复快速练习,题目按照题干的基本数据结构分类,且每个分类的第一篇必定是对基础数据结构的介绍。
寻找峰值【MID】
峰值定义:其值严格大于左右相邻值的元素
题干
解题思路
首先要注意题目条件,在题目描述中出现了 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),常数级变量,无额外辅助空间