本篇文章我们继续学习c++算法

目录
第一题
题目链接
题目展示

代码原理

图1
这里也许会有小伙伴看不懂右边的草图是怎么回事,首先我们先来回顾一下昨天的总结

图2
那么l和r两个指针就是在带入两个条件后,使得l和r的位置如图1一样,那么图一我因为没细看题目导致分析成了求左端点了,那么正确的是求右端点的
代码编写
class Solution {
public:
int mySqrt(int x) {
if(x < 1)
return 0;
int left = 1, right = x;
while(left < right)
{
long long mid = left + (right - left + 1) / 2;
if(mid * mid <= x)
left = mid;
else
right = mid - 1;
}
return left;
}
};
第二题
题目链接
题目展示

代码原理

图3
注意:图3中的t原本是代表目标值,但在本题中应该指的是mid - 1
代码编写
class Solution {
public:
int peakIndexInMountainArray(vector<int>& arr) {
int left = 0, right = arr.size() - 1;
while(left < right)
{
int mid = left + (right - left + 1) / 2;
if(arr[mid] > arr[mid - 1])
left = mid;
else
right = mid - 1;
}
return right;
}
};
第三题
题目链接
题目展示

代码原理

代码编写
class Solution {
public:
int findPeakElement(vector<int>& nums) {
int left = 0, 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;
}
};
下面来解答二三两题中的容易迷惑人的点。
第二题
![]()
第三题
![]()
那么这里来分析一下这里为啥第二题是mid - 1,第三题是mid + 1
第二题

第三题

本篇文章的内容就先到这里啦,我们下期文章再见!!!

记得一键三联哦!!!


被折叠的 条评论
为什么被折叠?



