力扣69题 x的平方根 二分查找法(简单易懂)

力扣69题 x的平方根 二分查找法(简单易懂)



题目描述

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

示例 1:
输入:x = 4
输出:2

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

思路

可以用二分查找的方法 0-3进行if判断
用二分找到midmid小于x 但(mid+1)(mid+1)大于x的值
然后缩小区间
下面是代码

代码

class Solution {
    public int mySqrt(int x) {
        if (x == 0)
            return 0;
        if (x <= 3)
            return 1;

        int left = 1, right = x / 2;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            // 直接定位
            if (mid <= x / mid && (mid + 1) > x / (mid + 1)) {
                return mid;
            } else if (mid > x / mid) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        // 不会走到这里的
        return 0;
    }
}

总结

一种人一种写法 建议大家用自己的二分做来题 不要一味去模仿他人的二分 加油!

使用 Java 解决力扣二分查找目的通用方法和步骤如下: ### 二分查找的基本思路 二分查找是一种在有序数组中查找特定元素的高效算法。它的基本思想是将数组分成两部分,然后根据中间元素与目标值的大小关系,缩小查找范围,直到找到目标值或确定目标值不存在。 ### 二分查找的代码实现 #### 基本二分查找 ```java public class BinarySearch { public static int search(int[] nums, int target) { int low = 0; int high = nums.length - 1; while (low <= high) { int mid = low + (high - low) / 2; if (nums[mid] == target) { return mid; } else if (nums[mid] < target) { low = mid + 1; } else { high = mid - 1; } } return -1; } } ``` 上述代码是一个基本的二分查找实现,在有序数组中查找目标值。如果找到目标值,返回其索引;否则返回 -1。该代码参考了引用 [1] 中的实现思路。 #### 二维矩阵中的二分查找 ```java class Solution { public boolean searchMatrix(int[][] matrix, int target) { int rows = matrix.length; int cols = matrix[0].length; int left = 0; int right = rows * cols - 1; while (left <= right) { int mid = left + (right - left) / 2; int midVal = matrix[mid / cols][mid % cols]; if (midVal == target) { return true; } else if (midVal < target) { left = mid + 1; } else { right = mid - 1; } } return false; } } ``` 此代码用于在一个每行和每列都递增的二维矩阵中查找目标值。将二维矩阵视为一维数组,在这个一维数组上进行二分查找。该代码参考了引用 [3] 中的实现思路。 ### 使用二分法的前提条件 使用二分法需要满足以下条件: 1. 数组必须是有序的。 2. 数组无重复元素,若有重复元素,则可能有不同的解 [^4]。 ### 注意事项 - 在计算中间位置时,使用 `mid = low + (high - low) / 2` 而不是 `mid = (low + high) / 2`,以避免整数溢出问 [^1][^2]。 - 循环条件通常是 `low <= high`,确保在查找范围只有一个元素时也能正确处理 [^1][^2][^3][^4]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值