【动态规划】Leetcode 279. 完全平方数【中等】

2024-04-25 13:28

本文主要是介绍【动态规划】Leetcode 279. 完全平方数【中等】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

完全平方数

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

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

示例 1:

输入:n = 12
输出:3
解释:12 = 4 + 4 + 4

解题思路

  • 1、使用动态规划求解,定义一个一维数组dp,其中dp[i]表示和为i的完全平方数的最少数量。
  • 2、初始化数组dp,长度为n + 1,全部初始化为最大值,dp[0]为0。
  • 3、对于每个数字i,遍历从1到sqrt(i)的完全平方数j*j,更新dp[i]为dp[i - j * j] + 1和dp[i]中的较小值。
    动态规划的状态转移方程为:
  •   dp[i] = min(dp[i], dp[i - j * j] + 1),其中 1 <= j * j <= i
    
    这个方程的意思是,如果当前的数 i 可以由 j * j 和 i - j * j 组成,那么 dp[i] 就可以通过 dp[i - j * j] + 1 来更新,即将 j * j 加入到和为 i 的完全平方数的组合中。
  • 4、最终返回dp[n]即可。

Java实现

public class PerfectSquares {public int numSquares(int n) {int[] dp = new int[n + 1];Arrays.fill(dp, Integer.MAX_VALUE);dp[0] = 0;/*** 首先,定义一个数组 dp[],其中 dp[i] 表示组成数值 i 的最小平方数数量。** 然后,通过两层循环遍历所有可能的数值 i,从 1 到 n。** 内层循环中,对于当前数值 i,我们尝试找到组成它的最小平方数数量。* 我们遍历所有小于等于 i 的平方数,记为 j * j,并更新 dp[i] 的值为* dp[i - j * j] + 1 的最小值。也就是说,我们找到了一个平方数 j * j,* 并尝试用它去更新 i 的最小平方数数量,看是否可以得到更优的解。** 最终,当外层循环结束时,dp[n] 中存储的就是组成数值 n 的最小平方数数量。* 这种解法的核心思想是利用动态规划的思想,* 通过计算子问题的最优解来构建更大规模问题的最优解。* 通过从小到大的顺序计算所有可能的数值 i,我们可以确保在计算 dp[i] 时,* dp[i - j * j] 已经计算过了,并且存储了正确的结果,* 从而确保每个状态的最优解被正确计算出来。*/for (int i = 1; i <= n; i++) {for (int j = 1; j * j <= i; j++) {dp[i] = Math.min(dp[i], dp[i - j * j] + 1);}}return dp[n];}public static void main(String[] args) {PerfectSquares ps = new PerfectSquares();int n = 12;System.out.println("Minimum number of perfect squares: " +ps.numSquares(n)); // Output: 3 (12 = 4 + 4 + 4)}
}

时间空间复杂度

  • 时间复杂度:外层循环遍历了n次,内层循环遍历了sqrt(n)次,时间复杂度为O(n * sqrt(n))。

  • 空间复杂度:使用了长度为n + 1的数组dp,空间复杂度为O(n)。

这篇关于【动态规划】Leetcode 279. 完全平方数【中等】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/934811

相关文章

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

从入门到精通详解Python虚拟环境完全指南

《从入门到精通详解Python虚拟环境完全指南》Python虚拟环境是一个独立的Python运行环境,它允许你为不同的项目创建隔离的Python环境,下面小编就来和大家详细介绍一下吧... 目录什么是python虚拟环境一、使用venv创建和管理虚拟环境1.1 创建虚拟环境1.2 激活虚拟环境1.3 验证虚

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

Python ORM神器之SQLAlchemy基本使用完全指南

《PythonORM神器之SQLAlchemy基本使用完全指南》SQLAlchemy是Python主流ORM框架,通过对象化方式简化数据库操作,支持多数据库,提供引擎、会话、模型等核心组件,实现事务... 目录一、什么是SQLAlchemy?二、安装SQLAlchemy三、核心概念1. Engine(引擎)

MySQL 数据库表操作完全指南:创建、读取、更新与删除实战

《MySQL数据库表操作完全指南:创建、读取、更新与删除实战》本文系统讲解MySQL表的增删查改(CURD)操作,涵盖创建、更新、查询、删除及插入查询结果,也是贯穿各类项目开发全流程的基础数据交互原... 目录mysql系列前言一、Create(创建)并插入数据1.1 单行数据 + 全列插入1.2 多行数据

浅谈MySQL的容量规划

《浅谈MySQL的容量规划》进行MySQL的容量规划是确保数据库能够在当前和未来的负载下顺利运行的重要步骤,容量规划包括评估当前资源使用情况、预测未来增长、调整配置和硬件资源等,感兴趣的可以了解一下... 目录一、评估当前资源使用情况1.1 磁盘空间使用1.2 内存使用1.3 CPU使用1.4 网络带宽二、

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注