leedcode-指针篇(2)

633.平方数之和

题目

给定一个非负整数c,要判断是否存在两个整数a和b,使得 a 2 + b 2 = c a^2+b^2=c a2+b2=c
示例:

输入:c=5
输出:true
解释:1*1+2*2=5

思路

一开始我的想法是设置两个指针,范围是从0到c,然后开始遍历寻找,后来通过测试崩了,我再细细想了一下,发现,应该从最极端的结果开始入手,假设c=5,那么a=0的时候,b就只能是 b \sqrt b b ,由此可以得出,末位指针应该指向根号c。这样确定上界方式应该会比较有依据

代码

class Solution:
    def judgeSquareSum(self, c: int) -> bool:
        if c<0:
            return False
        start,end=0,int(sqrt(c))
        while start<=end:
            result=start**2+end**2
            if result<c:
                start+=1
            elif result>c:
                end-=1
            else:
                return True
        return False

测试用例

import math
def judgeSquareSum(c):
	if c<0:
		return False #此处的另一种写法是assert c>=0
	start,end=0,int(math.sqrt(c))
	while start<=end:
		result=start*start+end*end
		if result<c:
			start+=1
		elif result>c:
			end-=1
		else:
			return True
	return False

print(judgeSquareSum(4))

注意:这里的 start 和 end是需要考虑相等的情况,因为有可能出现 2^2+ 2^2=8

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值