当前位置: 首页 > article >正文

【LeetCode】279. 完全平方数

目录

  • 题目描述
  • 输入输出示例及数据范围
  • 思路
  • C++ 实现

题目描述

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

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

输入输出示例及数据范围

在这里插入图片描述

思路

又是一道我之前已经做过许多遍但这一次仍然做不出来的题,遂在此整理一下这道题的思路。

这道题需要使用动态规划来解决,具体来说,假设我们有一个长度为n的数组ff[n]代表的就是对于整数n,最少可以用多少个完全平方数的加和来表示它, 1 , 4 , 9 , 16 , . . . 1, 4, 9, 16, ... 1,4,9,16,...这些数都是完全平方数。

看到这里自然可以想到,在状态转移的过程中,可能会牵涉到f[i - j * j],初步的思路确实没问题,但是我卡在这里不知道下一步应该做什么了。

由于题目要求的是,最少可以用多少个完全平方数来表示目标整数,我们遂从1开始向n枚举,比如对于某个数i,既然我们想要知道最少可以用多少个完全平方数来表示它,那么我们从1开始枚举完全平方数,假定现在枚举到j,满足j * j <= i。显然,我们在f[i - j * j]的基础上加1,就是使用最少完全平方数表示i的答案,因为f[i - j * j]本身的含义就是表示i - j * j这个数所需要的完全平方数的最小数目。

我们在枚举j的过程中,是从1开始枚举的,约束条件为j * j <= i,只要在这个过程中找到最小的f[i - j * j],即可更新f[i]

C++ 实现

class Solution {
public:
    int numSquares(int n) {
        vector<int> dp(n + 1, 0);
        for(int i=1; i<=n; i++) {
            int minn = INT_MAX;
            for(int j=1; j*j<=i; j++) {
                minn = min(minn, dp[i - j * j]);
            }
            dp[i] = minn + 1;
        }
        return dp[n];
    }
};

http://www.kler.cn/a/570398.html

相关文章:

  • 【MySQL数据库】SQL语法基础--DQL(入门级)
  • 在CentOS 7上为YUM安装的Nginx添加模块及第三方模块stream
  • 如何把图片或者图片地址存到 MySQL 数据库中以及如何将这些图片数据通过 JSP 显示在网页中
  • 数据标注/AI训练师技术图谱与学习路径
  • 前端模块化管理深度解析:从混沌到秩序的全链路实践指南
  • 探索Elasticsearch:文档的CRUD
  • 【C++动态规划 子集状态压缩】2002. 两个回文子序列长度的最大乘积|1869
  • 计算机毕业设计SpringBoot+Vue.js疫苗发布和接种预约系统(源码+文档+PPT+讲解)
  • Excel大文件拆分
  • 【网络原理】详解 HTTPS 协议
  • Python - Python操作Redis
  • 简单的前端原型:个性化广告文案生成
  • 从零开始构建高效Spring Boot应用:实战案例与最佳实践
  • vue3+ts+uniapp+unibest 微信小程序(第四篇)——小程序分包,解决主包过大无法上传平台问题
  • 深度学习transfomer架构的职业匹配系统
  • iOS开发之最新Demo上传Github步骤(2025.02.28)
  • 虚拟机配置
  • HTTP四次挥手是什么?
  • 编辑器的使用
  • 【Python】使用库