【leetcode】69.x的平方根 (二分法+牛顿法,java实现)

本文介绍了如何使用二分法和牛顿法解决LeetCode第69题,即求解非负整数x的平方根。文章详细分析了两种方法的思路,包括二分法中避免死循环的技巧和牛顿法的迭代过程,并提供了Java代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

69. x 的平方根

实现 int sqrt(int x) 函数。

计算并返回 x 的平方根,其中 x 是非负整数。

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

示例 1:

输入: 4
输出: 2

示例 2:

输入: 8
输出: 2
说明: 8 的平方根是 2.82842..., 
     由于返回类型是整数,小数部分将被舍去。

分析

二分查找法应用于搜索平方根的思想很简单,其实就是“猜”,但是是有策略的“猜”,用“排除法”在有限的区间里,一次排除一半的区间元素,最后只剩下一个数,这个数就是题目要求的向下取整的平方根整数。

牛顿法最初提出的时候,是用于求解方程的根,它的基本思想是“以直代曲”,在迭代中搜索得到方程的近似解。

方法一:二分法

思路分析:使用二分法搜索平方根的思想很简单,就类似于小时候我们看的电视节目中的“猜价格”游戏,高了就往低了猜,低了就往高了猜,范围越来越小。因此,使用二分法猜算术平方根就很自然。

一个数的平方根肯定不会超过它自己,不过直觉还告诉我们,一个数的平方根最多不会超过它的一半,例如 8 的平方根,8 的一半是 4,4^2=16>8,如果这个数越大越是如此,因此我们要计算一下,这个边界是多少。为此,解如下不等式:

( a 2 ) 2 ≥ a \left(\cfrac{a}{2}\right)^2 \ge a (2a)2a

意即:如果一个数的一半的平方大于它自己,那么这个数的取值范围。解以上不等式得 a ≥ 4 a \ge 4 a4或者a≤0。

于是边界值就是 4,那么对 0、1、2、3 分别计算结果,很容易知道,这 4 个数的平方根依次是 0、1、1、1。

注意:这 4个特值如果没有考虑到,有可能导致你设置的搜索边界不正确。在使用二分法寻找平方根的时候,要特别注意边界值的选择,以下给出两个参考代码。

参考代码 1:所有的数都放在一起考虑,为了照顾到 0 把左边界设置为 0,为了照顾到 1 把右边界设置为 x // 2 + 1

public class Solution {
   
   

    public int mySqrt(int x) {
   
   
        // 注意:针对特殊测试用例,例如 2147395599
        // 要把搜索的范围设置成长整型
        // 为了照顾到 0 把左边界设置为 0
        long left = 0;
        // # 为了照顾到 1 把右边界设置为 x // 2 + 1
        long right = x 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值