题目1: 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
示例 1:
输入:x = 4
输出:2
示例 2:
输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842…, 由于返回类型是整数,小数部分将被舍去。
题目链接
分析: 注意二分的运用,平方根是目标值,那肯定要划出一个范围,大于等于0,则0为下界,找x的平方根,那x就为上界,符合二分要求。
注意:如果 mid * mid 的结果超出了 int 类型的范围(即大于 Integer.MAX_VALUE),就会发生溢出,结果会变成负数或其他不正确的值,所以加个long
class Solution {
public int mySqrt(int x) {
//此处想一下,为什么可以用二分?
//因为求目标值是非负数,且肯定在递增数中,通过划定范围来找到它。
int l=0;//二分查找的上界
int r=x;//下界,因为求的是x的算术平方根,划定x为上界刚好符合。
int n=-1;//最终的结果赋值
while(l<=r){
int mid=(l+r)/2;//平方根肯定除2,然后看他除尽与否!
//如果 mid * mid 的结果超出了 int 类型的范围(即大于 Integer.MAX_VALUE),就会发生溢出,结果会变成负数或其他不正确的值
if((long)mid*mid<=x){ //倘若得到的mid的平方小于x,肯定有戏(long确保了即使 mid * mid 很大时也不会溢出,能更精确一点)
n=mid;
l=mid+1;
}else{
r=mid-1;//都已经超过x了,肯定不是算术平方根的范畴了,给他减减。
}
}
return n;//返回最终的结果。
}
}
题目2: 给你一个正整数 num 。如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
完全平方数是一个可以写成某个整数的平方的整数。换句话说,它可以写成某个整数和自身的乘积。
示例 1:
输入:num = 16
输出:true
解释:返回 true ,因为 4 * 4 = 16 且 4 是一个整数。
示例 2:
输入:num = 14
输出:false
解释:返回 false ,因为 3.742 * 3.742 = 14 但 3.742 不是一个整数。
题目链接
class Solution {
public boolean isPerfectSquare(int num) {
int left=0;
int right=num;
boolean ant=false;
while(left<=right){
int mid=(left+right)/2;
long s=(long)mid*mid;
if(s<num){
left=mid+1;
}else if(s>num){
right=mid-1;// 64/2=32,32太大要减减
} else {
return true;
}
}
return false;
}
}
分析: 学会理解二分的应用,划边界取中值,而边界条件来自题目中。