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;
}
}
思路分析
-
若
x为0,直接返回0作为结果。 -
初始化左边界
left为1,右边界right为x。 -
当
left小于等于right时,执行以下操作:- 计算中间值
mid,使用(left + right) / 2的方式计算,这里使用left + (right - left) / 2可以避免整型溢出。 - 若
mid * mid等于x,说明找到了平方根,直接返回mid作为结果。 - 若
mid * mid小于x,说明平方根在mid的右侧,更新left为mid + 1。 - 若
mid * mid大于x,说明平方根在mid的左侧,更新right为mid - 1。
- 计算中间值
-
循环结束后,返回
right作为结果,因为right是最接近平方根的整数。
注意,这里将左右边界left和right定义为long类型,是为了避免中间计算过程中的整型溢出问题。最后返回时将right强制转换为int类型。
搜索二维矩阵
来源:力扣(LeetCode) 链接:leetcode.cn/problems/se…
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
- 每行中的整数从左到右按升序排列。
- 每行的第一个整数大于前一行的最后一个整数。
示例 1:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true
示例 2:
输入: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;
}
}
思路分析
由于矩阵的行和列都是有序的,我们可以利用二分查找的思想进行搜索。具体思路如下:
-
获取矩阵的行数
m和列数n。 -
初始化左边界
left为0,右边界right为m * n - 1,表示整个矩阵的元素范围。 -
在循环中,执行以下操作:
- 计算中间元素的索引
mid,使用(left + right) / 2的方式计算,这里使用left + (right - left) / 2可以避免整型溢出。 - 将一维索引
mid转换为二维索引row和col,其中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。
- 计算中间元素的索引
-
若循环结束后仍未找到目标值,说明目标值不存在于矩阵中,返回
false。