C++算法
二分查找算法详解:山峰数组的峰顶索引与寻找峰值
山峰数组的峰顶索引与寻找峰值问题可通过二分查找高效解决。利用数组先增后减或局部峰值的二段性特征,比较中间值与相邻元素大小关系,逐步缩小搜索区间,将时间复杂度优化至 O(log n)。核心在于识别单调性变化点并确定边界条件。

山峰数组的峰顶索引与寻找峰值问题可通过二分查找高效解决。利用数组先增后减或局部峰值的二段性特征,比较中间值与相邻元素大小关系,逐步缩小搜索区间,将时间复杂度优化至 O(log n)。核心在于识别单调性变化点并确定边界条件。



分析峰顶位置的数据特点,以及山峰两旁的数据特点:
因此,我们可以分为以下两种情况:
class Solution {
public:
int peakIndexInMountainArray(vector<int>& arr) {
// 区间划分:[ 小于峰值 ], [ 大于等于峰值 ](相当于查找左端点)
int left = 0;
int right = arr.size();
while(left < right) {
int mid = left + (right - left) / 2;
// 对于偶数而言 mid 始终是在左边,所以判断条件是 arr[mid] < arr[mid + 1]
if(arr[mid] < arr[mid + 1]) {
left = mid + 1;
} else {
right = mid;
}
}
return left;
}
};



寻找二段性:任取一个点 i,与下一个点 i+1,会有如下两种情况:
当我们找到【二段性】的时候,就可以尝试用【二分查找】算法来解决问题。
class Solution {
public:
int findPeakElement(vector<int>& nums) {
int left = 0;
int right = nums.size() - 1;
while(left < right) {
int mid = left + (right - left) / 2;
if(nums[mid] < nums[mid + 1]) {
left = mid + 1;
} else {
right = mid;
}
}
return left;
}
};


微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online