leetcode_动态规划/递归 279**. 完全平方数

server/2025/3/1 18:55:36/

279. 完全平方数

  • 给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。

  • 完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。

1. 动态规划

  • 思路:
    1. 初始化:dp[0] = 0,因为和为 0 不需要任何完全平方数

    2. 对于每个i (1~n),遍历所有小于等于 i 的完全平方数 j * j,并更新 dp[i] 为 dp[i - j * j] + 1 的最小值

class Solution(object):def numSquares(self, n):""":type n: int:rtype: int"""# 初始化dp数组, dp[i]表示和为i的完全平方数的最少数量dp = [float('inf')] * (n + 1)dp[0] = 0  # 和为0不需要任何完全平方数for i in range(1, n + 1):# 遍历所有小于等于i的完全平方数for j in range(1, int(math.sqrt(i)) + 1):dp[i] = min(dp[i], dp[i - j*j] + 1)return dp[n]
  • 时间复杂度:O(n * sqrt(n)),因为需要遍历1到 n,并且对于每个 i,最多需要遍历 sqrt(i) 次

  • 空间复杂度:O(n),使用了一个大小为 n+1 的数组 dp

2. 广度优先搜索

  • 思路:

    1. 将 n 作为起始节点

    2. 每次从当前节点减去一个完全平方数,得到新的节点

    3. 使用 BFS 来找到从 n 到 0 的最短路径

class Solution(object):def numSquares(self, n):""":type n: int:rtype: int"""# 生成所有小于等于n的完全平方数squares = [i * i for i in range(1, int(n**0.5) + 1)]# BFS 队列,存储 (当前值, 步数)queue = deque([(n, 0)])visited = set()  # 记录已经访问过的节点while queue:current, steps = queue.popleft()# 遍历所有完全平方数for square in squares:next_val = current - squareif next_val == 0:  # 找到目标return steps + 1if next_val > 0 and next_val not in visited:visited.add(next_val)queue.append((next_val, steps + 1))return -1  # 如果没有找到,返回 -1(理论上不会发生)
  • 时间复杂度:O(n * sqrt(n)),BFS 最多会遍历 n 个节点,每个节点最多有 sqrt(n) 条边

  • 空间复杂度:O(n),用于存储队列和访问记录


http://www.ppmy.cn/server/171606.html

相关文章

DeepSeek-R1本地部署保姆级教程

一、DeepSeek-R1本地部署配置要求 (一)轻量级模型 ▌DeepSeek-R1-1.5B 内存容量:≥8GB 显卡需求:支持CPU推理(无需独立GPU) 适用场景:本地环境验证测试/Ollama集成调试 (二&a…

etcd 3.15 三节点集群管理指南

本文档旨在提供 etcd 3.15 版本的三节点集群管理指南,涵盖节点的新增、删除、状态检查、数据库备份和恢复等操作。 1. 环境准备 1.1 系统要求 操作系统:Linux(推荐 Ubuntu 18.04 或 CentOS 7) 内存:至少 2GB 磁盘&a…

Spring Boot 中如何正确地在异步线程中使用 HttpServletRequest

Spring Boot 中如何正确地在异步线程中使用 HttpServletRequest 前言一、问题的来源:为什么异步线程中无法访问 HttpServletRequest?1. 请求上下文与线程绑定2. 异步线程访问请求对象时的常见问题 二、Tomcat 的 request 复用机制及其影响1. Tomcat 请求…

Golang快速上手02/Golang基础

4.控制语句 4.1条件控制语句 4.1.1if-elseif-else 与clang不同&#xff0c;if不需要加() if <condition1> {<block1> } else if <condition2> {<block2> } else {<block0> }示例 a : 10 if a > 5 {fmt.Println("a > 5") } els…

Selenium 不同语言绑定版本的官方操作文档获取途径(科学上网)

Selenium 不同语言绑定版本的官方操作文档获取途径 Selenium 是一个强大的自动化测试工具&#xff0c;支持多种编程语言绑定。以下为你详细介绍不同语言绑定版本的官方操作文档获取途径。 一、Python 语言绑定 1.1 官方文档 地址&#xff1a;Selenium Python 官方文档内容概…

【JSON2WEB】15 银河麒麟操作系统下部署JSON2WEB

【JSON2WEB】系列目录 【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSO…

数据库基础一(初步了解数据库)

数据库基础概念 数据库访问方式 为什么要学习数据库? 90%以上的软件都需要操作数据,比如游戏、社交、新闻、商城、财务等 什么是数据库? 数据库专业的来说,其实就是一种电子的仓库,是专门储存数据和管理数据的一种处所,用户可以对数据库中的数据进行新增、更新或者删…

记一次命令行启动springboot项目的问题 java -jar的问题

错误的写法 java -jar ruoyi-admin.jar -Dloader.path.\lib 正确的写法 java -Dloader.path./lib -jar ruoyi-admin.jar 或者 java -jar -Dloader.path./lib ruoyi-admin.jar -Dloader.path必须卸载 -jar ruoyi-admin.jar之前&#xff0c;其实我试过了-Dloader.path命令只要…