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 + 1) / 2;
//对于偶数而言mid始终是在右边,所以判断条件是arr[mid - 1] < arr[mid]
if(arr[mid - 1] < arr[mid]) {
left = mid;
} else {
right = mid - 1;
}
}
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