算法(二分查找)

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

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

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

示例 1:

复制代码
输入:x = 4
输出:2

示例 2:

复制代码
输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

算法原理:我们主要要搞清楚到底怎么划分区间

我们通过实例1和2可以看到 我们要将这个区间分为小于等于 和大于

我们就使用二分查找的左边界法

复制代码
package erfen;

public class Xpingfang {
    class Solution {
        public int mySqrt(int x) {
            if(x<1)return 0;
            long left=0,right=x;
            while(left<right){
                long mid=left+(right-left+1)/2;
                if(mid*mid<=x)left=mid;
                else right=mid-1;
            }
            return (int)left;


        }
    }
}

2.搜索插入位置

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

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

示例 1:

复制代码
输入: nums = [1,3,5,6], target = 5
输出: 2

示例 2:

复制代码
输入: nums = [1,3,5,6], target = 2
输出: 1

示例 3:

复制代码
输入: nums = [1,3,5,6], target = 7
输出: 4

提示:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums无重复元素升序排列数组
  • -104 <= target <= 104

算法原理

我们从例子看 可以把区间分为大于等于区间和小于区间

因此 这里我们就用右端点二分查找法

复制代码
class Solution {
    public int searchInsert(int[] nums, int target) {
        int left=0,right=nums.length-1;
        if(nums.length==0)return -1;
        while(left<right){
            int mid=left+(right-left)/2;
            if(nums[mid]>=target)right=mid;
            else left=mid+1;
        }
        if(nums[left]<target)return left+1;
        return left;
      

    }
}
相关推荐
octopus_c3 小时前
数据结构:堆(Heap)详解
c语言·数据结构·算法
YH55269848 小时前
GPT‑5.6 Sol 原本支持 1M 上下文,Codex 现已放开此前限制,如何看待这次调整?
java·jvm·人工智能·gpt·算法·chatgpt
遥感知识服务10 小时前
从局部阈值、双极化到暗地表剔除:NASA OPERA DSWx-S1全球动态水体算法拆解
大数据·人工智能·深度学习·神经网络·算法·机器学习
晚风醉蝶10 小时前
1-13-TimSort
算法
ZJU_统一阿萨姆10 小时前
【算子开发】算子融合与Softmax_LayerNorm实现
人工智能·算法·语言模型·硬件架构
叩码以求索12 小时前
浅谈:前序遍历反转法求解N叉树的后序遍历
算法
北风toto14 小时前
中缀、前缀、后缀表达式
算法·软件设计师
听取WA声一片(无恶意)14 小时前
CSP-J/CSP-S 深度优先搜索(DFS)完全讲义
c++·算法·深度优先
码流怪侠14 小时前
2026年8月GitHub热榜深度拆解:Agent Skills席卷开源圈,一个“技能包“收割5万星
算法·程序员·github
hold?fish:palm14 小时前
30 两两交换链表中的节点
数据结构·算法·链表