适合做网站的图片,杭州软件开发公司,杭州小程序托管公司,uc浏览器网页版入口给定一个非负整数 c #xff0c;你要判断是否存在两个整数 a 和 b#xff0c;使得 a2 b2 c 。 示例 1#xff1a;
输入#xff1a;c 5 输出#xff1a;true 解释#xff1a;1 * 1 2 * 2 5 示例 2#xff1a;
输入#xff1a;c 3 输出#xff1a;false 示例 3你要判断是否存在两个整数 a 和 b使得 a2 b2 c 。 示例 1
输入c 5 输出true 解释1 * 1 2 * 2 5 示例 2
输入c 3 输出false 示例 3
输入c 4 输出true 示例 4
输入c 2 输出true 示例 5
输入c 1 输出true
提示
0 c 231 - 1
解题思路
维护lr两个元素值,l0,rsqrt©,满足了lr条件,当llrr小于目标值就需要移动左指针。当llrr大于目标值说明元素太大了就需要移动右指针。
原理
相当于每次固定一个右边界然后收缩左边界。 为什么每次左指针不从1开始遍历而是从上次的左指针开始 因为每次更换右边界的条件是llrrc, 这证明当前两个左指针的平方和太大了所以需要换一个更小的右指针。那左指针前面的值为什么不行呢
例如l-1因为l是由l-1转移来的而l-1转移到l的条件是l*lr-rc(注意这里的r是缩减边界前的r))在r更大的情况下l-1产生的平方和都是偏小了而现在又边界还收缩了产生的平方和就更小了所以根本不需要从1重新遍历一次直接从左指针开始就可以了。
代码
func judgeSquareSum(c int) bool {l,r:0,int(math.Sqrt(float64(c)))for lr {cur:l*lr*rif curc{return true}else if curc{l}else {r--}}return false}复杂度分析
时间复杂度O(sqrt©)。最坏情况下 l 和 r 一共枚举了 0 到 sqrt© 里的所有整数。
空间复杂度O(1)。