C++算法第八天

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

目录

第一题

题目链接

题目展示

代码原理

代码编写

第二题

题目链接

题目展示

代码原理

代码编写

第三题

题目链接

题目展示

代码原理

代码编写


第一题

题目链接

69. x 的平方根 - 力扣(LeetCode)

题目展示

代码原理

图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;

    }

};

第二题

题目链接

852. 山脉数组的峰顶索引 - 力扣(LeetCode)

题目展示

代码原理

图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;

    }

};

第三题

题目链接

162. 寻找峰值 - 力扣(LeetCode)

题目展示

代码原理

代码编写

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

第二题

第三题

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

记得一键三联哦!!!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值