• 【算法挨揍日记】day09——35. 搜索插入位置、69. x 的平方根


     35. 搜索插入位置

    35. 搜索插入位置

    题目描述:

    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

    请必须使用时间复杂度为 O(log n) 的算法。

     解题思路:

    本题有两种可能:

    • 当t(target)在数组中,返回其下标
    • t不在数组中,返回它应该插入的位置的下标

    可以将数组看成两个区。【数组=t】

    这就变成了找第二个数组【数组>=t】的第一个位置

    也就变成了需要左端点的问题了

    当循环结束后,left==right了,此时需要考虑边界问题,也就是nums【left】和t的关系,如果小于则返回left的下一个位置

     解题代码:

    1. class Solution {
    2. public:
    3. int searchInsert(vector<int>& nums, int target) {
    4. int left=0,right=nums.size()-1;
    5. while(left
    6. {
    7. int mid=left+(right-left)/2;
    8. if(nums[mid]==target)return mid;
    9. if(nums[mid]1;
    10. if(nums[mid]>target)right=mid;
    11. }
    12. //此时left==right,考虑边界问题
    13. if(nums[left]return left+1;
    14. return left;
    15. }
    16. };

    69. x 的平方根

    69. x 的平方根

    题目描述:

    给你一个非负整数 x ,计算并返回 x 的 算术平方根 。

    由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

    注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

    解题思路:

    本题可以变成我们从0到x中找一个数mid,mid的平方最接近x,也可以等于x

    将0-x数组分为两部分,一部分【0,mid】【mid+1,x】因此就变成找左区间的右端点了 

    解题代码:

    1. class Solution {
    2. public:
    3. int mySqrt(int x) {
    4. long long left=0,right=x;
    5. while(left
    6. {
    7. long long mid=left+(right-left+1)/2;
    8. if(mid*mid
    9. if(mid*mid==x)return mid;
    10. if(mid*mid>x) right=mid-1;
    11. }
    12. return right;
    13. }
    14. };

     

  • 相关阅读:
    处理器架构和配置
    shiro反序列化漏洞复现
    重塑 Google 搜索、Android 13 新版发布,这届 I/O 大会为开发者带来了什么?
    springboot使用Freemark生成动态页面工具
    操作系统:进程与线程大解析
    【OpenCV】-霍夫变换
    gateway网关
    Chart.xkcd图表库
    Vue插槽slot详解
    智慧公厕设备选型攻略,打造智能化便利生活体验
  • 原文地址:https://blog.csdn.net/m0_69061857/article/details/133465824