Learn && Live
虚度年华浮萍于世,勤学善思至死不渝
前言
Hey,欢迎来到Connor的算法练习室,这个系列记录了我的算法练习过程,欢迎各位大佬阅读斧正!原创不易,转载请注明出处:http://t.csdn.cn/t6Dyq,话不多说我们马上开始!
69.x的平方根⭐️
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5
示例1:
输入:x = 4
输出:2
示例2:
输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
提示:
0 <= x <= 231 - 1
解题思路:
x平方根的整数部分是满足 k * k ≤ x 的最大k值
class Solution {
public int mySqrt(int x) {
int left = 0, right = x, res = -1;
while(left <= right) {
int mid = (left + right) / 2;
if((long) mid * mid <= x) {
res = mid;
left = mid + 1;
} else
right = mid - 1;
}
return res;
}
}
367.有效的完全平方数⭐️
给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
进阶:不要 使用任何内置的库函数,如 sqrt 。
示例1:
输入:num = 16
输出:true
示例2:
输入:num = 14
输出:false
提示:
1 <= num <= 2^31 - 1
解题思路:
同上一题,根据返回值的要求修改一下判断的条件即可
class Solution {
public boolean isPerfectSquare(int num) {
int left = 0, right = num, pos = -1;
while(left <= right) {
int mid = (left + right) / 2;
if((long)mid * mid == num)
return true;
else if((long)mid * mid < num)
left = mid + 1;
else
right = mid - 1;
}
return false;
}
}
剑指 Offer 04. 二维数组中的查找⭐️⭐️
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
示例:
[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]
给定 target = 5,返回 true。
给定 target = 20,返回 false。
限制:
0 <= n <= 1000
0 <= m <= 1000
解题思路:
定位到每一行的最后一个元素,如果target比它大,则target在下一行;如果target比它小,则target在这一行的前面位置
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if(matrix.length == 0 || matrix == null) {
return false;
}
int rows = matrix.length, cols = matrix[0].length;
int row = 0, col = cols - 1;
while(row < rows && col >= 0) {
if(matrix[row][col] == target)
return true;
else if(matrix[row][col] < target)
row++;
else
col--;
}
return false;
}
}