完全平方数

本节学习解决平方数问题.即使在没有明显数或图结构的情景中,只要将问题抽象化为类似树或图的结构,就可以应用广度优先搜索算法.

问题描述:

给定一个正整数,找出该整数至少可以由几个完全平方数累加组成.完全平方数是指整数的平方数.如1,4,9等.

思路解析:

试着将题目抽象成一个从根节点0到子叶节点n的过程,逐层向下累加,直到累加之和为n为止,此时的深度即为完全平方数的个数.但是每一层累加时只能加上完全平方数,因此我们缩小了范围.当给定值为n时,只有1到int(n**0.5)的平方数是备选项.

例如,当n=13时,int(13**0.5)为3,每层可累加的数只有1,4,9这3个,在一定程度上缩小了计算范围,提高了效率.由于最终要输出所需完全平方数的个数,即那个节点的深度,因此在每个节点上在用一个变量来代表深度.所需变量如下:

n变量:表示给定的正整数

selecteed变量:表示1到int(n**0.5)的平方数,即已被累加的平方数

visited变量:表示已经出现过的累加之和

queue变量:表示队列

current变量:表示从队列取出头部元素中的累加之和的值

height变量:表示从队列取出头部元素的深度值

sum_变量:表示加上完全平方数之后的累加之和,需要检测是否已经存在visited

完整代码如下:

python 复制代码
from collections import deque

def square(n):
    # 生成一个包含1到n的平方根之间的所有完全平方数的列表
    selected = [i**2 for i in range(1, int(n**0.5) + 1)]
    
    # 用于记录已经访问过的数字,避免重复处理
    visited = set()
    
    # 初始化队列,存储格式为(当前数字, 当前高度)
    queue = deque([(0, 0)])
    
    # 循环直到队列为空
    while queue:
        current, height = queue.popleft()  # 取出队列的第一个元素
        
        # 遍历所有选定的完全平方数
        for i in selected:
            sum_ = current + i  # 计算当前数字与完全平方数的和
            
            # 如果和等于目标数字n,返回当前高度加1(因为找到了一个解)
            if sum_ == n:
                return height + 1
            
            # 如果和小于n且未被访问过,将其加入访问集合,并将其加入队列
            if sum_ < n and sum_ not in visited:
                visited.add(sum_)
                queue.append((sum_, height + 1))
相关推荐
算法鑫探1 天前
闰年判断:C语言实战解析
c语言·数据结构·算法·新人首发
WBluuue1 天前
数据结构与算法:康托展开、约瑟夫环、完美洗牌
c++·算法
木子墨5161 天前
LeetCode 热题 100 精讲 | 并查集篇:最长连续序列 · 岛屿数量 · 省份数量 · 冗余连接 · 等式方程的可满足性
数据结构·c++·算法·leetcode
2501_921960851 天前
双相自指图与弦论边界非对易性的结构同源
数据结构
王老师青少年编程1 天前
csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:均分纸牌
c++·算法·编程·贪心·csp·信奥赛·均分纸牌
EQUINOX11 天前
2026年码蹄杯 本科院校赛道&青少年挑战赛道提高组初赛(省赛)第一场,个人题解
算法
萝卜小白1 天前
算法实习Day04-MinerU2.5-pro
人工智能·算法·机器学习
Liangwei Lin1 天前
洛谷 P3133 [USACO16JAN] Radio Contact G
数据结构·算法
weixin_513449961 天前
PCA、SVD 、 ICP 、kd-tree算法的简单整理总结
c++·人工智能·学习·算法·机器人
code_pgf1 天前
Qwen2.5-VL 算法解析
人工智能·深度学习·算法·transformer