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

news2024/11/26 4:20:16

279. 完全平方数

难度:中等
力扣地址:https://leetcode.cn/problems/perfect-squares/

没有刷过的小伙伴们请一定要先去刷一次,然后如果感兴趣的话再阅读以下内容,便于交流 ~ 多谢支持 ~

在这里插入图片描述

问题描述

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

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

示例 1

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

示例 2:

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

提示:

  • 1 <= n <= 1 0 4 10^4 104

问题分析

首先应当明确两点:

  • 这是一个 动态规划 问题;
  • 这是动态规划中的 背包问题

如果对背包问题或者动态规划都不太了解也不碍事,那么可以先添加几个测例,并且我们做一波分析,考虑到直接阅读文字有点无聊,我做了几页PPT,请阅读以下截图。

在这里插入图片描述
这一页 PPT 内容有点多,不过总体来说也是比较容易理解,接下来我们需要想想如何拆解。

在这里插入图片描述

代码编写

注释比较详细,建议考虑结合PPT的内容与注释理解每一行代码的作用。

class Solution {
public:
    int numSquares(int n) {
        // 存储所有对应的可能的结果,此处的 answers[n] 就等同于PPT中我们描述的 f(n)
        // 比如 f(25) = 1,表示 n 为 25 时,结果为 1
        // 比如 f(10) = 2,表示 n 为 10 时,结果为 2 即 10 = 3 * 3 + 1 
        int answers[n + 1];
        // answer[0] 表示,如果某个数是平方数,那么后面计算的 left 就为 0,
        // 所以对于完全平方数,answer 就应该为 answer[0] + 1 表示最少一种拆解结果
        answers[0] = 0;
        // 求解历史的结果,便于我们作差后回来找历史结果
        // 比如求解 f(26) 时,left = 26 - 1 * 1 = 25,如果我们已经计算 f(25) = 1
        // 因此 f(26) = 2
        for (int i = 1; i <= n; i++) {
            // 初始化一个超级大值,便于以后做 min 计算
            int ans = INT_MAX;
            // 拆分的结束条件,因为 left = i - pow
            // 如果 j > end,那么 i - pow 将会小于 0,这不合理
            // 因为我们希望拆解为 i = j * j + left 并且 left 一定大于等于 0
            int end = sqrt(i);
            // 尝试所有可能的拆解方式
            // 比如 f(32) = f(16) + f(16), f(32) = f(25) + f(4) + f(3)
            // 我们需要循环算所有拆解可能,并求最小的结果,记录到 ans 中 
            for (int j = 1; j <= end; j++) {
                int pow = j * j;
                int left = i - pow;
                ans = min(ans, answers[left] + 1);
            }
            // answers[i] 记录了 n 为 i 时的最小结果,也就是在所有拆解方式中,
            // 这种方式分解后的整数个数最小
            answers[i] = ans;
        }
        // 返回 f(n) 的结果
        return answers[n];
    }
};
  • 时间复杂度: O ( n n ) O(n\sqrt{n}) O(nn )
  • 空间复杂度: O ( n ) O(n) O(n)

总结

这个题最重要的点应该包括:

  1. 状态转移方程:
    • 如果 x x x 不是平方数, f ( x ) = min ⁡ ( f ( x 1 ) + f ( x − x 1 ) ) f(x) = \min{(f(x_1) + f(x-x_1))} f(x)=min(f(x1)+f(xx1)),即拆解为两个数的计算值,并且在所有的 f ( x 1 ) + f ( x − x 1 ) f(x_1) + f(x-x_1) f(x1)+f(xx1) 的结果中,找到最小的作为我们的最终结果;比如 f ( 26 ) = f ( 1 ) + f ( 25 ) = 2 f(26) = f(1) + f(25) = 2 f(26)=f(1)+f(25)=2
    • 如果 x x x是平方数,则返回 1;比如 f ( 4 ) = 1 f(4) = 1 f(4)=1
  2. 存储中间计算过程,比如求解 f ( 26 ) f(26) f(26) 时,我们存储了 f ( 25 ) f(25) f(25) 的结果。

多谢小伙伴们的支持 ~

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

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

相关文章

sql server启动、连接 与 navicat连接sql server

一、sql server 启动 1.搜索cmd->以管理员身份运行 2.输入以下命令 net start mssqlserver 3.服务器启动成功 二、sql server连接 1.打开ssms&#xff0c;输入&#xff0c;连接 2.右键&#xff0c;属性 3.连接&#xff0c;勾选允许远程连接到此服务器 三、navicat连接sq…

论文浅尝 | 通过基于动态文档知识图谱增强的大语言模型故事理解

笔记整理&#xff1a;许方舟&#xff0c;天津大学硕士&#xff0c;研究方向为知识图谱 链接&#xff1a;https://ojs.aaai.org/index.php/AAAI/article/view/21286 1. 动机 基于大型 Transformer 的语言模型在需要叙事理解的各种任务上取得了令人难以置信的成功&#xff0c;包括…

核方法总结(三)———核主成分(kernel PCA)学习笔记

一、核主成分 1.1 和PCA的区别 PCA &#xff08;主成分分析&#xff09;对应一个线性高斯模型&#xff08;参考书的第二章&#xff09;&#xff0c;其基本假设是数据由一个符合正态分布的隐变量通过一个线性映射得到&#xff0c;因此可很好描述符合高斯分布的数据。然而在很多实…

基于GWO灰狼优化的多目标优化算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1灰狼优化算法原理 4.2 多目标优化问题(MOP)的帕累托最优解 4.3 基于GWO的多目标优化算法 5.完整程序 1.程序功能描述 基于GWO灰狼优化的多目标优化算法matlab仿真&#xff0c;目标函数…

java基于ssm+jsp 咨询交流论坛

1 管理员登录 管理员输入个人的用户名、密码登录系统&#xff0c;这时候系统的数据库就会在进行查找相关的信息&#xff0c;如果我们输入的用户名、密码不正确&#xff0c;数据库就会提示出错误的信息提示&#xff0c;同时会提示管理员重新输入自己的用户名、密码&#xff0c;…

Vite: 代码分割与拆包

概述 在生产环境下&#xff0c;为了提高页面加载性能&#xff0c;构建工具一般将项目的代码打包(bundle)到一 起&#xff0c;这样上线之后只需要请求少量的 JS 文件&#xff0c;大大减少 HTTP 请求。当然&#xff0c;Vite 也不例 外&#xff0c;默认情况下 Vite 利用底层打包引…

JWT跨域认证

新建shop项目 新建bean包&#xff0c;再其包下新建User package com.example.shop.bean;public class User {private String username;private String password;// 可以根据需要添加其他字段&#xff0c;比如角色、邮箱等public String getUsername() {return username;}public…

“深入解析操作系统核心:进程管理与并发艺术“

操作系统中最核心的概念是进程:这是对正在运行程序的ー个抽象 并行 并发 “在任何多道程序设计系统中,CPU由一个进程快速切换至另ー个进程,使每个进程各运行几十或几百毫秒。严格地说,在某ー个瞬间,CPU只能运行ー个进程。但在1秒钟内,它可能运行多个进程,这样就产生并行的错觉…

【漏洞复现】电信网关配置管理系统——命令执行

声明&#xff1a;本文档或演示材料仅供教育和教学目的使用&#xff0c;任何个人或组织使用本文档中的信息进行非法活动&#xff0c;均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 电信网关配置管理系统是一个用于管理和配置电信网关设备的软件系…

【C++题解】1466. 等差数

问题&#xff1a;1466. 等差数 类型&#xff1a;简单循环 题目描述&#xff1a; Peter 同学刚刚在学校学习了等差数列的概念。 等差数列&#xff0c;指的是一组数&#xff0c;这些数连续 2 个数的差值是相等的&#xff0c;比如&#xff1a;123&#xff0c;135&#xff0c;852…

【AI提升】AI利器Tool Call/Function Call(二):OpenAI/qwen-agent/LangChain/Ollama

上一节快速使用了Tool Call 【AI提升】AI利器Tool Call/Function Call(一) &#xff0c;使用的是LangChainOllama&#xff0c;这一节说说为什么使用这个组合&#xff0c;以及其余的使用场景。 首先大家都知道&#xff0c;在目前AI的世界里&#xff0c;各大模型都还是跟着OpenA…

onnx模型转rknn到部署

简介 最近开始用3568的板子&#xff0c;之前是在用3399&#xff0c;cpu的话3399比3568强&#xff0c;但是3568有1T的npu算力&#xff0c;所以模型移植过来用npu使用&#xff0c;之前用ncnn感觉太慢了&#xff0c;rk的npu使用没有开源&#xff0c;所以没法兼容&#xff0c;只能跑…

聚鼎贸易:装饰画行业还有没有前景

在数字化的浪潮中&#xff0c;装饰画行业似乎被边缘化&#xff0c;成为传统与现代较量中的一片瓦砾。然而&#xff0c;透过表面的凋零&#xff0c;我们能够窥见其潜藏的蓬勃生机与无限前景。 随着社会的快速发展&#xff0c;人们对生活品质的追求日益提高。家&#xff0c;作为个…

Golang | Leetcode Golang题解之第204题计数质数

题目&#xff1a; 题解&#xff1a; func countPrimes(n int) int {primes : []int{}isPrime : make([]bool, n)for i : range isPrime {isPrime[i] true}for i : 2; i < n; i {if isPrime[i] {primes append(primes, i)}for _, p : range primes {if i*p > n {break}…

图像增强及运算篇之图像掩膜直方图和HS直方图

一.图像掩膜直方图 如果要统计图像的某一部分直方图&#xff0c;就需要使用掩码&#xff08;蒙板&#xff09;来进行计算。假设将要统计的部分设置为白色&#xff0c;其余部分设置为黑色&#xff0c;然后使用该掩膜进行直方图绘制&#xff0c;其完整代码如下所示。 # -*- codi…

golang使用RSA加密和解密

目录 前提 生成RSA公钥和密钥 读取文件 加密 解密 前提 本文章我们是先读取的RSA文件&#xff0c;所以需要先生成RSA&#xff0c;并且保存在文件中&#xff0c;再进行加密 生成RSA公钥和密钥 如果没有公钥和密钥&#xff0c;可以先看看我上一篇文章 生成RSA公钥和密钥h…

在 Java 中的使用Selenium 测试框架

Selenium 测试框架&#xff1a;在 Java 中的使用 Selenium 测试框架就是这样一个强大的工具&#xff0c;它为 Web 应用的自动化测试提供了全面且高效的解决方案。 一、Selenium 简介 Selenium 是一个开源的自动化测试工具集&#xff0c;专门用于测试 Web 应用程序。它支持多…

Camera Raw:编辑 - 曲线

Camera Raw “编辑”模块中的曲线 Curve面板提供了曲线这一强大的工具&#xff0c;通过精确控制亮度和对比度&#xff0c;以及调整红、绿、蓝通道的曲线&#xff0c;可以显著提升图像的视觉效果和色彩表现。这些调整工具为摄影师和图像编辑者提供了丰富的创意可能性&#xff0c…

Cesium 在加载 3dTiles 如何如何获取ID

文章目录 问题分析问题 加载的 3dTiles 打印content.getFeature(i)出来后如图所示,想获取到id值 分析 var tileset = mapLayer.init3dTileLayer({url:it.url,maximumMemoryUsage: it.maximumMemoryUsage,

python查找支撑数 青少年编程电子学会python编程等级考试三级真题解析2022年3月

目录 python查找支撑数 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python查找支撑数 2022年3月 python编程等级考试级编程题 一、题目要求…