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

35. 搜索插入位置

35. 搜索插入位置

题目描述:

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

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

解题思路:

本题有两种可能:

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

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

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

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

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

解题代码:

cpp 复制代码
class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int left=0,right=nums.size()-1;
        while(left<right)
        {
            int mid=left+(right-left)/2;
            if(nums[mid]==target)return mid;
            if(nums[mid]<target)left=mid+1;
            if(nums[mid]>target)right=mid;
        }
        //此时left==right,考虑边界问题
        if(nums[left]<target)return left+1;
        return left;
    }
};

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】因此就变成找左区间的右端点了

解题代码:

cpp 复制代码
class Solution {
public:
    int mySqrt(int x) {
        long long left=0,right=x;
        while(left<right)
        {
            long long mid=left+(right-left+1)/2;
            if(mid*mid<x) left=mid;
            if(mid*mid==x)return mid;
            if(mid*mid>x) right=mid-1;
        }
    
        return right;
    }
};

相关推荐
风吹乱了我的头发~3 小时前
Day52:2026年3月20日打卡
算法
2401_831824967 小时前
基于C++的区块链实现
开发语言·c++·算法
We་ct7 小时前
LeetCode 918. 环形子数组的最大和:两种解法详解
前端·数据结构·算法·leetcode·typescript·动态规划·取反
愣头不青7 小时前
238.除了自身以外数组的乘积
数据结构·算法
人工智能AI酱8 小时前
【AI深究】逻辑回归(Logistic Regression)全网最详细全流程详解与案例(附大量Python代码演示)| 数学原理、案例流程、代码演示及结果解读 | 决策边界、正则化、优缺点及工程建议
人工智能·python·算法·机器学习·ai·逻辑回归·正则化
WangLanguager8 小时前
逻辑回归(Logistic Regression)的详细介绍及Python代码示例
python·算法·逻辑回归
m0_518019488 小时前
C++与机器学习框架
开发语言·c++·算法
一段佳话^cyx8 小时前
详解逻辑回归(Logistic Regression):原理、推导、实现与实战
大数据·算法·机器学习·逻辑回归
qq_417695058 小时前
C++中的代理模式高级应用
开发语言·c++·算法
xiaoye-duck8 小时前
《算法题讲解指南:动态规划算法--路径问题》--5.不同路径,6.不同路径II
c++·算法·动态规划