LeetCode题练习与总结:完全平方数--279

一、题目描述

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

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

示例 1:

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

示例 2:

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

 

提示:

  • 1 <= n <= 10^4

二、解题思路

这是一个典型的动态规划问题。我们可以使用一个数组 dp 来保存到每个数 i 的最少的完全平方数数量。对于每个数 i,我们需要考虑所有小于等于 i 的完全平方数 jj(其中 jj <= i),然后找出 dp[i - j*j] + 1 的最小值。

以下是具体的步骤:

  1. 初始化一个长度为 n+1 的数组 dp,所有元素初始化为最大值(比如 Integer.MAX_VALUE),因为我们要找最小值。
  2. dp[0] 应该初始化为 0,因为 0 可以由 0 个完全平方数组成。
  3. 对于每个数 i(从 1 到 n),我们需要检查所有可能的完全平方数 jj(其中 jj <= i)。
  4. 对于每个 jj,我们将 dp[i] 更新为 min(dp[i], dp[i - jj] + 1)。
  5. 最终,dp[n] 就是我们要求的答案。

三、具体代码

class Solution {public int numSquares(int n) {// dp[i] 表示和为 i 的完全平方数的最少数量int[] dp = new int[n + 1];// 初始化 dp 数组Arrays.fill(dp, Integer.MAX_VALUE);// 0 可以由 0 个完全平方数组成dp[0] = 0;// 计算每个数的最少完全平方数数量for (int i = 1; i <= n; i++) {// 检查所有可能的完全平方数 j*jfor (int j = 1; j * j <= i; j++) {dp[i] = Math.min(dp[i], dp[i - j * j] + 1);}}// 返回和为 n 的完全平方数的最少数量return dp[n];}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 初始化 dp 数组的时间复杂度为 O(n),因为我们需要对 n+1 个元素进行填充操作。

  • 外层循环 for (int i = 1; i <= n; i++) 运行 n 次,因为它遍历了从 1 到 n 的每一个整数。

  • 内层循环 for (int j = 1; j * j <= i; j++) 的运行次数依赖于 i 的值。对于每个 i,j 的最大值为 sqrt(i),因此内层循环的运行次数随着 i 的增加而减少。

  • 当 i 较小时,sqrt(i) 接近 i,内层循环接近 i 次;当 i 较大时,sqrt(i) 接近 sqrt(n),内层循环接近 sqrt(n) 次。

  • 平均来看,内层循环的运行次数大约为 sqrt(i),所以我们可以将内层循环的总运行次数估计为所有 i 的 sqrt(i) 之和,即 sqrt(1) + sqrt(2) + … + sqrt(n)。由于 sqrt(i) 是一个递增函数,我们可以将其总和估计为小于 n * sqrt(n)。

因此,总的时间复杂度为 O(n) + O(n * sqrt(n)),简化后为 O(n * sqrt(n))。

2. 空间复杂度
  • dp 数组的大小为 n+1,因此需要 O(n) 的空间来存储所有的 dp 值。

  • 除了 dp 数组外,代码中没有使用额外的空间,所有的变量都是常数级别的空间。

因此,总的空间复杂度为 O(n)。

五、总结知识点

  • 动态规划 (Dynamic Programming, DP):

    • 动态规划是一种算法设计技术,用于求解具有重叠子问题和最优子结构的问题。
    • dp 数组用于存储子问题的解,避免重复计算。
  • 数组的初始化:

    • 使用 new int[n + 1] 创建一个整型数组 dp,其长度为 n + 1
    • 使用 Arrays.fill(dp, Integer.MAX_VALUE) 初始化数组 dp 的所有元素为 Integer.MAX_VALUE,表示初始时没有找到解。
  • 基础循环结构:

    • 两个嵌套的 for 循环用于遍历所有可能的数和它们的完全平方数。
  • 数学运算:

    • 使用 j * j 计算完全平方数。
    • 使用 Math.min 函数来找出当前问题的最小解。
  • 数组的索引操作:

    • 通过索引 i 和 i - j * j 访问和更新 dp 数组。
  • 递推关系:

    • dp[i] = Math.min(dp[i], dp[i - j * j] + 1) 表示状态转移方程,用于更新 dp[i] 为最小的完全平方数数量。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

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

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

相关文章

Unity3D 单例模式

Unity3D 泛型单例 单例模式 单例模式是一种创建型设计模式&#xff0c;能够保证一个类只有一个实例&#xff0c;提供访问实例的全局节点。 通常会把一些管理类设置成单例&#xff0c;例如 GameManager、UIManager 等&#xff0c;可以很方便地使用这些管理类单例&#xff0c;…

BM1 反转链表

要求 代码 /*** struct ListNode {* int val;* struct ListNode *next;* };*/ /*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可*** param head ListNode类* return ListNode类*/ struct ListNode* ReverseList(struct …

从零开始讲PCIe(10)——事务层介绍

一、事务层概述 事务层在响应软件层的请求时&#xff0c;会生成出站数据包。同时&#xff0c;它也会检查入站数据包&#xff0c;并将其中包含的信息传递到软件层。事务层支持非发布事务的分割事务协议&#xff0c;能够将入站的完成数据包与之前传输的非发布请求相关联。该层处理…

After-kaoyan

知乎 - 安全中心 有态度&#xff0c;有回应&#xff0c;有温度&#xff0c;是跟双鱼相处的基础 我今天跟大家泄漏一个秘密&#xff0c;这个秘密也很简单&#xff0c;就是我每次遇到困难险阻时候我从不退缩&#xff0c;我也不会想着&#xff1a;“算了吧&#xff0c;我做不到&a…

C/C++/EasyX——入门图形编程(5)

【说明】友友们好&#xff0c;今天来讲一下键盘消息函数。&#xff08;其实这个本来准备和鼠标消息函数放在一起的&#xff0c;但是上一篇三个放在一起&#xff0c;内容就有点多了&#xff0c;只写一个又太单调了&#xff0c;所以键盘消息函数的内容就放在这一篇了 (^&#xff…

用manim实现Gram-Schmidt正交化过程

在线性代数中&#xff0c;正交基有许多美丽的性质。例如&#xff0c;由正交列向量组成的矩阵(又称正交矩阵)可以通过矩阵的转置很容易地进行反转。此外&#xff0c;例如&#xff1a;在由彼此正交的向量张成的子空间上投影向量也更容易。Gram-Schmidt过程是一个重要的算法&#…

Oracle 表空间异构传输

已经有了表空间的数据文件&#xff0c;和元数据dump文件&#xff0c;如何把这个表空间传输到异构表空间中&#xff1f; 查询异构传输平台信息&#xff1a; COLUMN PLATFORM_NAME FORMAT A40 SELECT PLATFORM_ID, PLATFORM_NAME, ENDIAN_FORMAT FROM V$TRANSPORTABLE_PLATFORM O…

LLM大模型:开源RAG框架汇总

前言 本文搜集了一些开源的基于LLM的RAG&#xff08;Retrieval-Augmented Generation&#xff09;框架&#xff0c;旨在吸纳业界最新的RAG应用方法与思路。如有错误或者意见可以提出&#xff0c;同时也欢迎大家把自己常用而这里未列出的框架贡献出来&#xff0c;感谢~ RAG应用…

【Python】数据可视化之聚类图

目录 clustermap 主要参数 参考实现 clustermap sns.clustermap是Seaborn库中用于创建聚类热图的函数&#xff0c;该函数能够将数据集中的样本按照相似性进行聚类&#xff0c;并将聚类结果以矩阵的形式展示出来。 sns.clustermap主要用于绘制聚类热图&#xff0c;该热图通…

训练验证器解决数学应用题

人工智能咨询培训老师叶梓 转载标明出处 数学问题解决不仅要求模型能够理解问题的语言表述&#xff0c;还要求其能够准确地执行一系列数学运算&#xff0c;每一步的准确性都至关重要。遗憾的是&#xff0c;现有的语言模型在这一领域的性能远远未能达到人类的水平&#xff0c;它…

[C#]使用onnxruntime部署yolov11-onnx实例分割模型

【官方框架地址】 https://github.com/ultralytics/ultralytics.git 【算法介绍】 在C#中使用ONNX Runtime部署YOLOv11-ONNX实例分割模型&#xff0c;涉及到模型的加载、数据预处理、模型推理和后处理几个关键步骤。 首先&#xff0c;需要确保已经安装了ONNX Runtime的NuGe…

站岗放哨树形dp

前言&#xff1a;好久没有写树上dp了&#xff0c;这儿题目还是挺有意思的 题目地址 #include<bits/stdc.h> #include<iostream> using namespace std;//#define int long long int n; const int N (int)1e510; int e[N],ne[N],h[N],idx 0; int dp[2][N];void add…

FLUX1.1PRO震撼来袭:蓝莓揭开神秘面纱,4网站体验,6倍卓越速率和更高质量,竞技场角逐超越所有模型,Elo最高分

大家好我是安琪&#xff01;&#xff01;&#xff01; FLUX 1.1 PRO震撼来袭&#xff1a;蓝莓揭开神秘面纱&#xff0c;4网站体验&#xff0c;6倍卓越速率和更高质量&#xff0c;竞技场角逐超越所有模型&#xff0c;Elo最高分 在人工智能领域&#xff0c;图像生成与反推技术的…

登 Nature 子刊!论文一作详解蛋白质语言模型的小样本学习方法,解决湿实验数据匮乏难题

在「Meet AI4S」系列直播第三期中&#xff0c;我们有幸邀请到了上海交通大学自然科学研究院 & 上海国家应用数学中心博士后周子宜&#xff0c; 他所在的上海交通大学洪亮课题组研究方向主要为 AI 蛋白和药物设计、分子生物物理。该课题组研究成果颇丰&#xff0c;截止目前共…

Steamdeck SteamOs 安装单机版冒险岛079

Steamdeck SteamOs 安装单机版冒险岛079 复制资源到SteamDeck添加游戏到Steamdeck![请添加图片描述](https://i-blog.csdnimg.cn/direct/4e18b0e9b6a84a07851c7d75c452a048.png) 复制资源到SteamDeck 链接&#xff1a;https://pan.baidu.com/s/1CGCthOcfbYRS6y150HAuzw?pwdap…

Semantic Communications With AI Tasks——面向图像分类任务的语义传输系统

论文链接&#xff1a; 2109.14170 (arxiv.org)https://arxiv.org/pdf/2109.14170 1. 背景 无线网络从“万物互联”向“智能互联”转变的范式变化&#xff0c;这与香农和韦弗关于通信演变的预言相一致。传统的无线网络侧重于信号的准确传输&#xff08;技术层面&#xff09;&…

从0到1:企事业单位知识竞赛答题小程序迭代开发笔记一

背景调研 企事业单位知识竞赛答题小程序&#xff0c;在信息技术迅猛发展的时代&#xff0c;企业和事业单位在提升员工素质和知识水平方面面临着新的挑战。为了增强员工的学习积极性、提高团队凝聚力和整体素质&#xff0c;越来越多的单位开始组织知识竞赛活动。传统的知识竞赛…

【全球顶级域名后缀】

数据时间: 2024.10.6 广告: 五分钟申请SSL证书 (手机电脑都能用) ["aaa","aarp","abarth","abb","abbott","abbvie","abc","able","abogado","abudhabi","ac"…

GemFilter:基于早期层压缩加速长文本LLM推理

GemFilter 是一种用于加速长文本输入的 LLM 推理并降低内存消耗的新型 AI 方法&#xff0c;其利用 LLM 早期层识别关键信息的能力&#xff0c;从而显著压缩输入序列&#xff0c;并在保持性能的同时&#xff0c;实现高达 2.4 倍的加速和 30% 的内存使用减少。 论文介绍 大型语…

从代码到语言:CoreGen 助力自动化提交信息生成

1.概述 源代码与自然语言之间的语义鸿沟是生成高质量代码提交信息的一个重大挑战。代码提交信息对于开发者来说非常重要&#xff0c;因为它们简明扼要地描述了代码更改的高层次意图&#xff0c;帮助开发人员无需深入了解具体实现即可掌握软件的演变过程。手动编写高质量的提交信…