news 2026/1/27 20:00:29

力扣 完全平方数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
力扣 完全平方数

一、题目回顾

给定一个正整数n,要求找到最少数量的完全平方数(如 1, 4, 9, 16, …),使它们的和等于n

示例

  • n = 12 → 4 + 4 + 4 → 3

  • n = 13 → 4 + 9 → 2

本质问题一句话总结:

把 n 拆成若干个完全平方数之和,要求个数最少


二、第一反应:这是一个“最少”问题

一看到「最少多少个」,而且允许重复使用数字,很容易联想到:

  • 背包问题

  • 动态规划

  • 状态转移

而这里的“物品”就是所有 ≤ n 的完全平方数。


三、状态设计(这是题目的核心)

1️⃣ 状态定义

设:

dp[i]表示组成数字 i 所需要的最少完全平方数个数

目标就是求dp[n]


2️⃣ 状态初始化

  • dp[0] = 0
    组成 0 不需要任何数(很重要的边界)

  • 其他dp[i]初始可以设成一个很大的值(表示“还没算出来”)


四、关键一步:状态转移怎么来?

思考方式(非常重要)

假设我们要算dp[i]

  • 如果最后一步用了一个平方数

  • 那么在此之前,已经凑出了i - k²

  • 所以:

dp[i] = dp[i - k^2] + 1

但问题是:

k 可以取多少?


只枚举到 √i(平方根技巧)

因为:

  • k² ≤ i

  • 所以 k ≤ √i

这一步非常关键,它直接决定了复杂度。

于是有:

dp[i] = min (dp[i - k^2] + 1)

class Solution { public: int numSquares(int n) { int dp[10001]; for (int i=1;i<=n;i++) { int num=(int)std::sqrt(i); int min=100000; for(int j=1;j<=num;j++) { if (dp[i-j*j]+1<min) min=dp[i-j*j]+1; } dp[i]=min; } return dp[n]; } };

五、算法流程总结(口语版)

  1. 从 1 一路算到 n

  2. 对于每个 i:

    • 枚举所有k² ≤ i

    • 尝试用作为最后一个数

    • 更新最小值

  3. 最终返回dp[n]

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/27 9:07:05

Triton推理服务器部署微调后的模型及测试

使用Triton推理服务器部署微调后的模型&#xff0c;并通过基准测试&#xff08;如MMLU、GPQA&#xff09;验证模型效果。 把这个过程拆解为模型转换、Triton部署、基准测试三个核心步骤&#xff0c;给出可落地的操作指南和代码&#xff0c;确保你能一步步完成部署和验证。 一、…

作者头像 李华
网站建设 2026/1/24 1:50:25

探索:在微软工作是一种怎样的体验(六)

面试所需的长期准备基础知识这个不用多说&#xff0c;作为一名优秀的程序员必须要很好地掌握编程语言、数据结构、算法、数据库、操作系统、网络等基本功。刷题近些年来&#xff0c;刷力扣越来越流行。有很多童鞋会问&#xff0c;刷多少比较合适呢&#xff1f;当然是多多益善咯…

作者头像 李华
网站建设 2026/1/17 19:13:39

要让 SAP SD 销售订单行项目里的“重量”“毛重”等字段重新可编辑,99% 的情况都不是权限问题,而是系统标准逻辑

要让 SAP SD 销售订单行项目里的“重量”“毛重”等字段重新可编辑&#xff0c;99% 的情况都不是权限问题&#xff0c;而是系统标准逻辑&#xff1a;只要该行已经生成了交货单&#xff08;Delivery&#xff09;&#xff0c;这些属于「装运层」的字段就被自动锁掉&#xff0c;避…

作者头像 李华