java算法题解法_LeetCode算法题-Valid Perfect Square(Java实现-四种解法)

这是悦乐书的第209次更新,第221篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第77题(顺位题号是367)。给定正整数num,写一个函数,如果num是一个完美的正方形,则返回True,否则返回False。例如:

输入:16

输出:true

输入:14

输出:false

注意:不要使用任何内置库函数,例如sqrt。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

暴力解法,定义一个long类型的变量,for循环判断其平方是否小于num,但是不要写循环体,这样省时,最后直接判断其平方是否等于num。

public boolean isPerfectSquare(int num) {

if (num <= 1) {

return num == 1;

}

long i = 1;

for( ; i*i < num; i++);

return i*i == num;

}

03 第二种解法

使用二分查找,起点为1,终点为num,取两数中间值,然后判断平方是否等于num,如果大了,就把终点指向当前中间值减1;如果小了,就把起点指向当前中间值加1。

此解法中,为了防范溢出的风险,使用了long类型的变量。

public boolean isPerfectSquare2(int num) {

if (num <= 1) {

return num == 1;

}

long start = 1;

long end = num;

while (start <= end) {

long mid = (start+end)/2;

if (mid*mid == num) {

return true;

}

if (mid*mid < num) {

start = mid + 1;

}

if (mid*mid > num) {

end = mid -1;

}

}

return false;

}

04 第三种解法

使用牛顿迭代法,核心代码是:

x*x = num

x = num/x

2*x = x + num/x

x = (x + num/x)/2

对于x的初始值,我们取num的值,循环的判断条件是x的平方大于num,最后判断x的平方是否等于num。

public boolean isPerfectSquare3(int num) {

long x = num;

while (x*x > num) {

x = (x + num / x) / 2;

}

return x*x == num;

}

05 第四种解法

此题其实就是判断num能否被开平方且结果是整数。如1,4,9,16,25,36等,这些数字都是可以,。同样,我们可以观察一组奇数之和:

1 = 1

1+3 = 4

1+3+5 = 9

1+3+5+7 = 16

1+3+5+7+9 = 25

1+3+5+7+9+11 = 36

n个奇数(1,3,5,7,...)之和等于n的平方,其中n大于0。

对此,我们可以对num做减法,每次减去一个奇数,最后判断是否等于0。

public boolean isPerfectSquare4(int num) {

int i = 1;

while (num > 0) {

num -= i;

i += 2;

}

return num == 0;

}

06 小结

算法专题目前已连续日更超过两个月,算法题文章77+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值