力扣 完全平方数

devtools/2025/1/19 6:35:13/

动态规划,找到前几个状态做更新。

题目

从题可看出又是一道dp,只要找到一个最大的平方数,然后往回退到上个状态,然后再用回退的状态加回去这个平方数即加上这一种。注意这里的所含平方数并不是随着数字变大而变大的,因此还要加多一层循环做遍历的维护,目的是找到的平方数少。

java">class Solution {public int numSquares(int n) {int[] f = new int[n + 1];for (int i = 1; i <= n; i++) {f[i] = Integer.MAX_VALUE;for (int j = 1; j * j <= i; j++) {f[i] = Math.min(f[i], f[i - j * j]+1);//通过减去一个平方数对前面已经遍历的f[i]进行筛选}}return f[n];}
}

这里对f[i]做了频繁更新,实际只需要在后面更新一次即可,在做比较时可以用一个临时变量去存,这样就可以优化一下维护状态的数组了。

java">class Solution {public int numSquares(int n) {int[] f = new int[n + 1];for (int i = 1; i <= n; i++) {int minn = Integer.MAX_VALUE;for (int j = 1; j * j <= i; j++) {minn = Math.min(minn, f[i - j * j]);//通过减去一个平方数对前面已经遍历的f[i]进行筛选}f[i] = minn + 1;//更新当前数时加回去j*j这种情况}return f[n];}
}

然后也可以换一下内外层循环,先去生成所有完全平方数,然后做更新。

时间复杂度:O(n√n),空间复杂度:O(n)。

java">class Solution {public int numSquares(int n) {int[] f = new int[n + 1]; Arrays.fill(f, Integer.MAX_VALUE); f[0] = 0;for (int i = 1; i * i <= n; i++) {for (int j = i * i; j <= n; j++) {f[j] = Math.min(f[j], f[j - i * i] + 1);}}return f[n];}
}

在做dp时,学会找到状态间的关系,也要注意维护状态的数组优化。 


http://www.ppmy.cn/devtools/151759.html

相关文章

BEVFusion论文阅读

1. 简介 融合激光雷达和相机的信息已经变成了3D目标检测的一个标准&#xff0c;当前的方法依赖于激光雷达传感器的点云作为查询&#xff0c;以利用图像空间的特征。然而&#xff0c;人们发现&#xff0c;这种基本假设使得当前的融合框架无法在发生 LiDAR 故障时做出任何预测&a…

网络安全面试题及经验分享

本文内容是i春秋论坛面向专业爱好者征集的关于2023年面试题目和答案解析&#xff0c;题目是真实的面试经历分享&#xff0c;具有很高的参考价值。 shiro反序列化漏洞的原理 Shiro反序列化漏洞的原理是攻击者通过精心构造恶意序列化数据&#xff0c;使得在反序列化过程中能够执…

vue3使用vue-native-websocket-vue3通讯

vue3使用vue-native-websocket-vue3通讯 插件使用一、启用Vuex集成1.在mian.js中2.store/index.js文件中3.要websocket使用的页面 二、启用Piain集成1.在mian.js中2.根目录下创建store文件夹&#xff0c;分别创建PiniaType.ts&#xff0c;store.ts&#xff0c;useSocketStore.t…

PCB_Layout零基础学习线路

开始学习做一件事情之前&#xff0c;我们一般先回去了解它的历史&#xff0c;从前人的视角去接近它&#xff0c;让它变得不再陌生。那么问题来了&#xff1f; 1.什么是PCB ? 印刷电路板PCB&#xff0c;真的是天才想法吗&#xff1f;_哔哩哔哩_bilibili 了解了PCB之后我…

2025.1.15——假期回归训练,从sql注入开始|一、SQL整数型注入

第一阶段&#xff08;2025.1.15-2025.1.27&#xff09; 题目来源&#xff1a;CTFHub技能树。 “磨刀不误砍柴工” 所有题目的相同步骤&#xff1a;①整理已知信息&#xff1b;②联系相关信息&#xff1b;③用所学知识判断题型&#xff1b;④解题 目录 第一阶段&#xff08…

电机驱动-标准库和HAL库

一、标准库 Motor.c-标准库 #include "stm32f10x.h" // Device header #include "PWM.h"/*** 函 数&#xff1a;直流电机初始化* 参 数&#xff1a;无* 返 回 值&#xff1a;无*/ void Motor_Init(void) {RCC_APB2PeriphClockCmd…

python学opencv|读取图像(三十四)阈值处理-彩色图像

【1】引言 前序已经掌握了使用阈值处理函数控制灰度图的RGB值&#xff0c;相关链接为&#xff1a; python学opencv|读取图像&#xff08;三十三&#xff09;阈值处理图像-限定像素-CSDN博客 在更早的学习中&#xff0c;灰度图的RGB只有一个通道&#xff0c;也就是各个像素点…

Unity3D 移动端CPU端性能调优详解

前言 在Unity3D开发中&#xff0c;特别是在移动端&#xff0c;性能优化至关重要。CPU主要负责逻辑运算、物理计算和碰撞检测等核心任务。优化CPU性能不仅能提升游戏的流畅度&#xff0c;还能减少电量消耗和发热问题。本文将详细介绍Unity3D移动端CPU端的性能调优技术&#xff…