力扣二分查找练习题(x的平方根、搜索二维矩阵)

74 阅读3分钟

x的平方根

来源:力扣(LeetCode) 链接:leetcode.cn/problems/sq…

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

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

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

示例 1:

输入:x = 4

输出:2

示例 2:

输入:x = 8

输出:2

解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。

提示:

  • 0 <= x <= 231 - 1

代码

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

思路分析

  1. x为0,直接返回0作为结果。

  2. 初始化左边界left为1,右边界rightx

  3. left小于等于right时,执行以下操作:

    • 计算中间值mid,使用(left + right) / 2的方式计算,这里使用left + (right - left) / 2可以避免整型溢出。
    • mid * mid等于x,说明找到了平方根,直接返回mid作为结果。
    • mid * mid小于x,说明平方根在mid的右侧,更新leftmid + 1
    • mid * mid大于x,说明平方根在mid的左侧,更新rightmid - 1
  4. 循环结束后,返回right作为结果,因为right是最接近平方根的整数。

注意,这里将左右边界leftright定义为long类型,是为了避免中间计算过程中的整型溢出问题。最后返回时将right强制转换为int类型。

搜索二维矩阵

来源:力扣(LeetCode) 链接:leetcode.cn/problems/se…

编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:

  • 每行中的整数从左到右按升序排列。
  • 每行的第一个整数大于前一行的最后一个整数。

示例 1:

图片.png

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3

输出:true

示例 2:

图片.png

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13

输出:false

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 100
  • -104 <= matrix[i][j], target <= 104

代码

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int m = matrix.length;
        int n = matrix[0].length;

        int left = 0;
        int right = m * n - 1;

        while (left <= right) {
            int mid = left + (right - left) / 2;
            int row = mid / n;
            int col = mid % n;
            
            if (matrix[row][col] == target) {
                return true;
            } else if (matrix[row][col] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }

        return false;
    }
}

思路分析

由于矩阵的行和列都是有序的,我们可以利用二分查找的思想进行搜索。具体思路如下:

  1. 获取矩阵的行数m和列数n

  2. 初始化左边界left为0,右边界rightm * n - 1,表示整个矩阵的元素范围。

  3. 在循环中,执行以下操作:

    • 计算中间元素的索引mid,使用(left + right) / 2的方式计算,这里使用left + (right - left) / 2可以避免整型溢出。
    • 将一维索引mid转换为二维索引rowcol,其中row = mid / n表示行索引,col = mid % n表示列索引。
    • 若矩阵中的元素matrix[row][col]等于目标值target,则找到了目标值,返回true
    • 若矩阵中的元素matrix[row][col]小于目标值target,说明目标值可能在当前元素的右侧,更新左边界left = mid + 1
    • 若矩阵中的元素matrix[row][col]大于目标值target,说明目标值可能在当前元素的上方,更新右边界right = mid - 1
  4. 若循环结束后仍未找到目标值,说明目标值不存在于矩阵中,返回false