力扣第279题 完全平方数 c++ 附java代码 (完全背包)动态规划问题

题目

279. 完全平方数

中等

相关标签

广度优先搜索   数学   动态规划

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

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

示例 1:

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

示例 2:

输入:n = 13输出:2
解释:13 = 4 + 9

提示:

  • 1 <= n <= 104

思路和解题方法

  • 在两个版本中,都使用了一个一维数组 dp 来保存状态。其中,dp[i] 表示当目标数为 i 时,需要的最小完全平方数和。初始值为 INT_MAX 表示不可达。
  • 在第一个版本中,我们通过遍历背包和物品来更新状态。外层循环遍历背包,内层循环遍历物品,对于每一个背包 i,我们尝试将某个完全平方数 j*j 放入背包,然后更新状态。递推公式为:dp[i] = min(dp[i - j * j] + 1, dp[i]),表示将 j*j 放入背包后,需要的完全平方数和为 dp[i - j * j] + 1,与之前的状态 dp[i] 比较取较小值。
  • 而在第二个版本中,我们通过遍历物品和背包来更新状态。外层循环遍历物品,内层循环遍历背包,对于每一个物品 i*i,我们尝试将其放入背包 j 中,然后更新状态。递推公式为:dp[j] = min(dp[j - i * i] + 1, dp[j]),表示将 i*i 放入背包 j 后,需要的完全平方数和为 dp[j - i * i] + 1,与之前的状态 dp[j] 比较取较小值。
  • 两个版本的代码实现思路是一样的,只是遍历的顺序不同,但最终得到的结果是相同的。

复杂度

        时间复杂度:

                O(n * sqrt(n))  (sqrt()为开方函数)

时间复杂度:

        两个版本的代码都使用了嵌套循环。最外层的循环遍历的次数都是目标数 n,内层的循环遍历的次数都是完全平方数的个数,而最大的完全平方数为 sqrt(n),因此内层循环的时间复杂度为 O(sqrt(n))。因此,两个版本的代码的时间复杂度都是 O(n * sqrt(n))。

        空间复杂度

                O(n)

空间复杂度:

        两个版本的代码都使用了一个一维数组 dp 来记录状态。数组的长度为 n + 1,因此空间复杂度为 O(n)。而其他变量的空间复杂度都是常数级别的。

c++ 代码

// 版本一
class Solution {
public:int numSquares(int n) {vector<int> dp(n + 1, INT_MAX); // 创建一个大小为 n+1 的数组,初始化为 INT_MAX,表示不可达状态dp[0] = 0; // 初始条件,当目标数为 0 时,需要的最小完全平方数和为 0for (int i = 0; i <= n; i++) { // 遍历背包,i 表示当前目标数for (int j = 1; j * j <= i; j++) { // 遍历物品,j*j 表示完全平方数dp[i] = min(dp[i - j * j] + 1, dp[i]); // 更新状态,取较小值}}return dp[n]; // 返回目标数为 n 时的最小完全平方数和}
};// 版本二
class Solution {
public:int numSquares(int n) {vector<int> dp(n + 1, INT_MAX); // 创建一个大小为 n+1 的数组,初始化为 INT_MAX,表示不可达状态dp[0] = 0; // 初始条件,当目标数为 0 时,需要的最小完全平方数和为 0for (int i = 1; i * i <= n; i++) { // 遍历物品,i 表示当前物品,即完全平方数for (int j = i * i; j <= n; j++) { // 遍历背包,j 表示当前目标数dp[j] = min(dp[j - i * i] + 1, dp[j]); // 更新状态,取较小值}}return dp[n]; // 返回目标数为 n 时的最小完全平方数和}
};

Java代码

class Solution {// 版本一,先遍历物品, 再遍历背包public int numSquares(int n) {int max = Integer.MAX_VALUE;int[] dp = new int[n + 1];// 初始化for (int j = 0; j <= n; j++) {dp[j] = max;}// 当和为0时,组合的个数为0dp[0] = 0;// 遍历物品for (int i = 1; i * i <= n; i++) {// 遍历背包for (int j = i * i; j <= n; j++) {// 更新状态,取较小值dp[j] = Math.min(dp[j], dp[j - i * i] + 1);// 不需要这个if判断语句,因为在完全平方数这一问题中不会有"凑不成"的情况发生(一定可以用"1"来组成任何一个n),所以注释掉了这个if语句。}}return dp[n]; // 返回目标数为 n 时的最小完全平方数和}
}class Solution {// 版本二, 先遍历背包, 再遍历物品public int numSquares(int n) {int max = Integer.MAX_VALUE;int[] dp = new int[n + 1];// 初始化for (int j = 0; j <= n; j++) {dp[j] = max;}// 当和为0时,组合的个数为0dp[0] = 0;// 遍历背包for (int j = 1; j <= n; j++) {// 遍历物品for (int i = 1; i * i <= j; i++) {// 更新状态,取较小值dp[j] = Math.min(dp[j], dp[j - i * i] + 1);}}return dp[n]; // 返回目标数为 n 时的最小完全平方数和}
}

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/130799.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

飞行器坐标转换

飞行器坐标转换 坐标系定义方向余弦矩阵 坐标系定义 本文定义的是右手直角坐标系&#xff0c; x − y − z x-y-z x−y−z轴分别为北-天-东。 从 A A A坐标系到 B B B坐标系是分别绕 y − z − x y-z-x y−z−x轴&#xff0c;即天-东-北旋转 ψ − θ − γ \psi-\theta-\gamm…

什么是文件安全

文件安全就是通过实施严格的访问控制措施和完美的权限卫生来保护您的业务关键信息不被窥探&#xff0c;除了启用和监控安全访问控制外&#xff0c;整理数据存储在保护文件方面也起着重要作用。通过清除旧的、过时的和其他垃圾文件来定期优化文件存储&#xff0c;以专注于关键业…

AdvFaces: Adversarial Face Synthesis

AdvFaces: Adversarial Face Synthesis AdvFaces:对抗性人脸合成 摘要 我们提出了AdvFaces&#xff0c;一种自动对抗人脸合成方法&#xff0c;通过生成对抗网络学习在显著面部区域产生最小的扰动。一旦AdvFaces经过训练&#xff0c;它就可以自动产生难以察觉的扰动&#xff0…

Linux常用指令(二)——文件管理

Linux文件管理 2.1 创建文件 touch2.2 复制文件 cp2.3 删除文件 rm2.4 移动文件 mv2.5 重命名文件 rename2.6 查看文件 cat2.7 查看文件的类型 file2.8 编辑文件 vim2.9 打印文件内容 cat2.10 变更文件所有者 chown2.11 修改文件权限 chmod 更加完整的Linux常用指令 2.1 创建文…

JOSEF约瑟 数显三相电压继电器 HJY-931A/D 导轨安装

名称&#xff1a;数字交流三相电压继电器型号&#xff1a;HJY-93系列品牌&#xff1a;JOSEF约瑟电压整定范围&#xff1a;10~450VAC额定电压&#xff1a;200、400VAC功率消耗&#xff1a;≤5W HJY系列 数字交流三相电压继电器 系列型号 HJY-931A/D数字式交流三相电压继电器&am…

qt5.15.2+vs2019源码调试开发环境搭建

说明 一些qt文件不进行源码调试无法知道其中的原理。提高软件质量&#xff0c;从概念原理及应用角度看待必须知道qt类运行原理。 1.安装 在网上找到qt安装包qt-unified-windows-x64-4.5.1-online.exe&#xff0c;安装qt5.15.2&#xff0c;有选择Qt Debug Information Files …

mediasoup udp端口分配策略

mediasoup-worker多进程启动时&#xff0c;rtcMinPort/rtcMaxPort可以使用相同的配置。 for (let i 0; i < numWorkers; i) { let worker await mediasoup.createWorker({ logLevel: config.mediasoup.worker.logLevel, logTags: config.mediasoup.work…

框架和库:你需要知道的一切

在编程领域&#xff0c;框架和库是两个常见的概念。虽然它们都可以帮助我们更有效地编写代码&#xff0c;但它们之间有着明显的区别。在本文中&#xff0c;我们将探讨框架和库的定义、区别以及如何选择使用它们。 什么是框架&#xff1f; 框架是一种开发工具&#xff0c;它提供…

缺陷之灵魂操作bug

一、前言 正常来说&#xff0c;我们在测试缺陷的时候都是按照case来测试的&#xff0c;但是有些场景&#xff0c;例如说发散思维这种场景&#xff0c;就会找到一些比较不太正常、不好复现的缺陷&#xff0c;然后如果要辅助研发修复&#xff0c;就会极为痛苦。 二、场景描述 大…

Android 13.0 根据app包名授予app监听系统通知权限

1.概述 在13.0的系统rom产品定制化开发中,在一些产品rom定制化开发中,系统内置的第三方app需要开启系统通知权限,然后可以在app中,监听系统所有通知,来做个通知中心的功能,所以需要授权获取系统通知的权限,然后来顺利的监听系统通知。来做系统通知的功能,接下来来实现…

【多媒体文件格式】AMR

AMR 自适应多速率音频压缩&#xff08;Adaptive multi-Rate compression&#xff0c;简称AMR&#xff09;是一个使语音编码最优化的专利。AMR被标准语音编码 3GPP在1998年10月选用&#xff0c;现在广泛在GSM和UMTS中使用。它使用1-8个不同的比特率编码。 AMR 也是一个文件格式…

jmeter接口测试项目实战详解,零基础也能学,源码框架都给你

1.什么是jmeter&#xff1f; JMeter是100%完全由Java语言编写的&#xff0c;免费的开源软件&#xff0c;是非常优秀的性能测试和接口测试工具&#xff0c;支持主流协议的测试 2.jmeter能做什么&#xff1f; 1.JMeter是100%完全由Java语言编写的软件性能测试的GUI的测试工具&a…

C++二分查找算法的应用:最小好进制

本文涉及的基础知识点 二分查找 题目 以字符串的形式给出 n , 以字符串的形式返回 n 的最小 好进制 。 如果 n 的 k(k>2) 进制数的所有数位全为1&#xff0c;则称 k(k>2) 是 n 的一个 好进制 。 示例 1&#xff1a; 输入&#xff1a;n “13” 输出&#xff1a;“3” …

估计量的评价指标

评价估计量优劣的指标有无偏性、有效性和一致性 我们观察世界&#xff0c;是对观察到的事物在大脑中形成的估计值&#xff1b;我们用仪器测量某个参数&#xff0c;是通过仪器获得该参数的估计值。那么&#xff0c;估计值的优劣如何来评价&#xff1f; 无偏性 估计值的样本均…

[SSD综述1.3] SSD及固态存储技术30年简史

依公知及经验整理,原创保护,禁止转载。 专栏 《SSD入门到精通系列》 <<<< 返回总目录 <<<< 前言 在我们今天看来,SSD已不再是个新鲜事物。这多亏了存储行业的前辈们摸爬滚打了将近半个世纪,才有了SSD的繁荣,可惜很多前辈都没有机会看到这。所有…

ActiveMQ、RabbitMQ、RocketMQ、Kafka介绍

一、消息中间件的使用场景 消息中间件的使用场景总结就是六个字&#xff1a;解耦、异步、削峰 1.解耦 如果我方系统A要与三方B系统进行数据对接&#xff0c;推送系统人员信息&#xff0c;通常我们会使用接口开发来进行。但是如果运维期间B系统进行了调整&#xff0c;或者推送过…

(04)Mycat实现分库

1、如何选择分库表 #客户表 rows:20万 CREATE TABLE customer(id INT AUTO_INCREMENT,NAME VARCHAR(200),PRIMARY KEY(id) );#订单表 rows:600万 CREATE TABLE orders(id INT AUTO_INCREMENT,order_type INT,customer_id INT,amount DECIMAL(10,2),PRIMARY KEY(id) ); #…

@Configuration 注解的 Full 模式和 Lite 模式!

Configuration 注解相信各位小伙伴经常会用到&#xff0c;但是大家知道吗&#xff0c;这个注解有两种不同的模式&#xff0c;一种叫做 Full 模式&#xff0c;另外一种则叫做 Lite 模式。 准确来说&#xff0c;Full 模式和 Lite 模式其实 1. 概念梳理 首先我们先来看一下 Spr…

深入理解Java中的ThreadLocal

简介&#xff1a; 在多线程编程中&#xff0c;线程安全是一个关键问题。而ThreadLocal提供了一种轻量级的方式来实现线程级别的共享变量&#xff0c;每个线程都拥有独立的副本。本文将通过示例&#xff0c;详细解释ThreadLocal的使用方法和原理。 使用示例&#xff1a; 下面是…

PTA: h0116. 波兰表达式

波兰表达式 题目输入格式输出格式 提示输入样例输出样例 代码 题目 &#xff08;PTA题目描述有误&#xff0c;应该是波兰表达式&#xff09;逆波兰表达式是一种把运算符前置的算术表达式&#xff0c;例如普通的表达式2 3的逆波兰表示法为 2 3。逆波兰表达式的优点是运算符之间…