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

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.mfbz.cn/a/754754.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C# 入门—基本语法

一、数据类型 C# 语言中内置了一些基本的数据类型&#xff0c;数据类型用来指定程序中变量可以存储的数据的类型&#xff0c;C# 中的数据类型可以大致分为三类&#xff1a; 值类型&#xff08;Value types&#xff09;&#xff1b;引用类型&#xff08;References types&…

[推荐]有安全一点的网贷大数据信用查询网站吗?

在互联网金融日益发展的今天&#xff0c;网贷大数据查询网站成为了许多人申贷前的必备工具。随着使用这些网站的人群越来越多&#xff0c;安全问题也逐渐浮出水面。最近&#xff0c;就有许多用户反馈自己的个人信息在网贷大数据查询网站上被泄露。为了解决这一问题&#xff0c;…

Spring Cloud Gateway3.x自定义Spring Cloud Loadbalancer负载均衡策略以及实现动态负载均衡策略的方案

目录 前言 1.原理分析 1.1 ReactiveLoadBalancerClientFilter源码分析 1.2 LoadBalancerClientFactory源码分析 2.代码实现 2.1 扩展原生RoundRobinLoadBalancer轮询策略 2.1.1 自定义实现RoundRobinLoadBalancer 2.1.2 配置自定义的RoundRobinLoadBalan…

idea2024使用springboot3.x系列新建java项目,使用jdk17,启动项目报错

身为一名开发人员&#xff0c;敲代码无数&#xff0c;竟被一个小小启动给我卡了大半天&#xff0c;太丢脸了 报错一&#xff1a;Field infoSysRepository in com.erectile.Impl.PersonalInfoServiceImpl required a bean of type ‘com.erectile.jpa.repository.InfoSysReposit…

前端vue使用onlyoffice控件实现word在线编辑、预览(仅列出前端部分需要做的工作,不包含后端部分)

简介 ONLYOFFICE 文档 是一个开源办公套件&#xff0c;包括文本文档、电子表格、演示文稿和可填写表单的编辑器。 它提供以下功能&#xff1a; 创建、编辑和查看文本文档、电子表格、演示文稿和可填写表单&#xff1b; 与其他队友实时协作处理文件。 基于这个控件&#xff0c;…

微信小程序根据蓝牙RSSI信号强度测试设备距离

背景 在做小程序连接蓝牙设备的时候&#xff0c;有需求表明在搜索到0.5米之内的设备时自动连接 问题&#xff1a; 蓝牙模组只提供了RSSI信号强度&#xff0c;那又该如何计算蓝牙设备距离小程序的距离呢&#xff1f; 解决方案 通过以下公式做大量测试&#xff1a;求 A、n 的平均…

【深度学习】卷积神经网络CNN

李宏毅深度学习笔记 图像分类 图像可以描述为三维张量&#xff08;张量可以想成维度大于 2 的矩阵&#xff09;。一张图像是一个三维的张量&#xff0c;其中一维代表图像的宽&#xff0c;另外一维代表图像的高&#xff0c;还有一维代表图像的通道&#xff08;channel&#xff…

【LeetCode】四、栈相关:有效的括号 + 下一个更大的元素

文章目录 1、栈结构2、Java中的栈3、leetcode20&#xff1a;有效的括号4、leetcode496&#xff1a;下一个更大元素 1、栈结构 和队列相反&#xff0c;栈先进后出 时间复杂度&#xff1a;访问、插入、删除都在栈顶进行操作&#xff0c;时间复杂度为O(1)&#xff0c;搜索需要遍…

技术分享:分布式数据库DNS服务器的架构思路

DNS是企业数字化转型的基石。伴随微服务或单元化部署的推广&#xff0c;许多用户也开始采用分布式数据库将原来的单体数据库集群服务架构拆分为大量分布式子服务集群&#xff0c;对应不同的微服务或服务单元。本文将从分布式数据库DNS服务器的架构需求、架构分析两方面入手&…

2.用BGP对等体发送路由

2.用BGP对等体发送路由 实验拓扑&#xff1a; 实验要求&#xff1a;用BGP对等体发送路由信息 实验步骤&#xff1a; 1.完成基本配置&#xff08;略&#xff09; 2.建立BGP对等体&#xff08;略&#xff09; 3.创建路由信息&#xff08;用创建一个loop back接口就能产生一个直连…

【java】【控制台】【javaSE】 初级java家教管理系统控制台命令行程序项目

更多项目点击&#x1f446;&#x1f446;&#x1f446;完整项目成品专栏 【java】【控制台】【javaSE】 初级java家教管理系统控制台命令行程序项目 获取源码方式项目说明&#xff1a;功能点数据库涉及到&#xff1a; 项目文件包含&#xff1a;项目运行环境 &#xff1a;截图其…

HarmonyOS Next开发学习手册——弹性布局 (Flex)

概述 弹性布局&#xff08; Flex &#xff09;提供更加有效的方式对容器中的子元素进行排列、对齐和分配剩余空间。常用于页面头部导航栏的均匀分布、页面框架的搭建、多行数据的排列等。 容器默认存在主轴与交叉轴&#xff0c;子元素默认沿主轴排列&#xff0c;子元素在主轴…

网络流-EK算法(保姆级教学)

本文引用董晓算法的部分图片。 一些不能带入纸质资料的竞赛&#xff0c;网络流纳入考纲。 因为需要默写&#xff0c;想来也不会考默写dinic这种算法难倒大家&#xff0c;只需要快速敲对EK算法就行了。 EK算法能在O(n*m^2)的复杂度内解决最大流问题&#xff0c;其中最大流就是…

Flutter循序渐进==>封装、继承、多态、抽象类以及属性修改

导言 新学一门编程语言&#xff0c;最难以理解的莫过于类了。如果类没用&#xff0c;也就算了&#xff0c;它偏偏很有用&#xff0c;我们必须得掌握&#xff0c;不然怎么好意思说自己会面向对象编程呢? 抽象类&#xff08;Abstract Class&#xff09;在面向对象编程中扮演着…

如何看待AIGC中漫画版权争议?( 计育韬老师高校公益巡讲答疑实录2024)

这是计育韬老师第 8 次开展面向全国高校的新媒体技术公益巡讲活动了。而在每场讲座尾声&#xff0c;互动答疑环节往往反映了高校师生当前最普遍的运营困境&#xff0c;特此计老师在现场即兴答疑之外&#xff0c;会尽量选择有较高价值的提问进行文字答疑梳理。 *本轮巡讲主题除了…

java 操作 milvus 2.1.4

1. 确认 docker 运行的 milvus容器镜像版本情况&#xff1a; 2. pom 依赖&#xff1a; <dependency><groupId>io.milvus</groupId><artifactId>milvus-sdk-java</artifactId><version>2.1.0</version><exclusions><exclusi…

【秋招突围】2024届秋招笔试-科大笔试题-01-三语言题解(Java/Cpp/Python)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系计划跟新各公司春秋招的笔试题 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; 文章目录 &#x1f4d6…

在Tomcat中部署war包

1、准备war包 确保已经有一个有效的war包&#xff0c;该war包包含了web应用程序的所有内容&#xff1b; 2、停止tomcat服务器 在部署之前&#xff0c;确保tomcat服务器已经停止&#xff0c;进入tomcat的配置目录执行命令&#xff1a;[路径]/tomcat/conf&#xff1b; 在Linux…

前端vite+vue3——利用环境变量和路由区分h5、pc模块打包(从0到1)

⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享 前端vitevue3——利用环境变量和路由对前端区分h5和pc模块打包&#xff08;从0到1&#xff09;。 背景&#xff1a; 前端本地开发pc和h5的项目&#xff0c;发布时需要区分开h5和pc的页面 vite Vite 通过在一开始将应…

论文阅读--《FourierGNN:从纯图的角度重新思考多元时间序列预测》

Yi K, Zhang Q, Fan W, et al. FourierGNN: Rethinking multivariate time series forecasting from a pure graph perspective[J]. Advances in Neural Information Processing Systems, 2024, 36. 本次介绍的文章来自NeurIPS 2023&#xff0c;关于多变量时间序列的预测 摘要…