Python世界:力扣题633,平方数之和,中等

Python世界:力扣题633,平方数之和,中等

任务背景


问题来自力扣题目633. Sum of Square Numbers,大意如下:

Given a non-negative integer c, decide whether there're two integers a and b such that a^2 + b^2 = c.

翻译下,需求是:对给定数字c,确定是否有两个整数满足a^2+b^2=c

思路分析


二分法思路

  • 默认a,b均为非负,且b不小于a
  • 在0-sqrt©之间遍历a,直到a=b相遇或a>b跳出循环
  • cs = sqrt©
  • 此移动方式不通
    • 若b=sqrt(c-a^2) 圆整后,重加回满足目标,且b不小于a中断
    • 若b<a,a收缩为下界
    • 若b>a,a收缩为上界
  • 换为low/high双指针左右移动
    • 将0-cs之间的数平方和组合罗列为一种有序组合
    • 初始位:t = low^2+high^2,是在有序组合的中间
    • 若t > c,则缩小high
    • 若t < c,则增大low
    • 与纯二分区别在于,不仅单一mid在移动

代码实现


python 复制代码
import math

class Solution(object):
    def judgeSquareSum(self, c):
        """
        :type c: int
        :rtype: bool
        """
        res = False
        cs = int(math.sqrt(c)) + 1
        low = 0
        high = cs
        while (low <= high): # two pointer
            t = low**2 + high**2
            if (t < c):
                low += 1
            elif (t > c):
                high -= 1
            else:
                return True
        return res

测试套件


单例测试demo:

python 复制代码
# one case test
c = 5 # 1+4
c = 4 # 0+4
c = 3 # false
c = 13 # 4+9
c = 12 # false
c = 169 # 12^2+5^2

sol = Solution()
res = sol.judgeSquareSum(c)
print(res)

测试套demo:

python 复制代码
# 导入单元测试
import unittest


def test_base(self, c, ret):
    sol = Solution()
    res = sol.judgeSquareSum(c)
    self.assertEqual(res, ret)    


# 编写测试套
class TestSol(unittest.TestCase):
    # 不在
    def test_special1(self):
        c = 3
        ret = False
        test_base(self, c, ret)

    # 下边界
    def test_special2(self):
        c = 0
        ret = True
        test_base(self, c, ret)

    # 上边界
    def test_special3(self):
        c = 2**31 - 1
        ret = False
        test_base(self, c, ret)

    def test_common1(self):
        c = 5
        ret = True
        test_base(self, c, ret)

    def test_common2(self):
        c = 13
        ret = True
        test_base(self, c, ret)

    def test_common3(self):
        c = 169
        ret = True
        test_base(self, c, ret)


# 含测试套版本主调
if __name__ == '__main__':
    print('start!')
    unittest.main() # 启动单元测试
    print('done!')

本文小结


本题思路很简单,只为重温下二分写法,发现值大的下移上界,发现值小的上移下界,直到上下界重合。要特别注意的是无target时,mid的偏移问题。

相关推荐
小蜗牛慢慢爬行2 分钟前
有关异步场景的 10 大 Spring Boot 面试问题
java·开发语言·网络·spring boot·后端·spring·面试
Algorithm157612 分钟前
云原生相关的 Go 语言工程师技术路线(含博客网址导航)
开发语言·云原生·golang
岑梓铭12 分钟前
(CentOs系统虚拟机)Standalone模式下安装部署“基于Python编写”的Spark框架
linux·python·spark·centos
shinelord明21 分钟前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
游客52026 分钟前
opencv中的各种滤波器简介
图像处理·人工智能·python·opencv·计算机视觉
დ旧言~28 分钟前
专题八:背包问题
算法·leetcode·动态规划·推荐算法
Monly2128 分钟前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat
boligongzhu29 分钟前
DALSA工业相机SDK二次开发(图像采集及保存)C#版
开发语言·c#·dalsa
Eric.Lee202129 分钟前
moviepy将图片序列制作成视频并加载字幕 - python 实现
开发语言·python·音视频·moviepy·字幕视频合成·图像制作为视频
7yewh31 分钟前
嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目
linux·开发语言·arm开发·驱动开发·qt·opencv·嵌入式linux