LeetCode 算法:完全平方数 c++

server/2024/10/22 21:43:53/

题目

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

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

示例 1:

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

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

提示:

1 <= n <= 104

动态规划

动态规划(Dynamic Programming,简称DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学等领域中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常用于优化问题,特别是那些具有重叠子问题和最优子结构性质的问题。

动态规划的关键概念:

  1. 重叠子问题:原问题可以分解为多个子问题,而这些子问题会重复出现多次。
  2. 最优子结构:一个问题的最优解包含其子问题的最优解。
  3. 无后效性:一旦某个状态被确定,它就不受之后决策的影响。
  4. 状态转移方程:描述了问题的状态如何从先前的状态转移而来。

动态规划的步骤:

  1. 定义状态:确定问题的状态,通常用数组或变量来表示。
  2. 确定状态转移方程:找出状态之间的关系,即如何从一个状态推导出另一个状态。
  3. 确定初始状态和边界条件:设置问题的起始状态和基本情况。
  4. 计算顺序:确定如何计算所有状态,通常从初始状态开始,逐步计算到最终状态。
  5. 构造最优解:从最终状态开始,逆向回溯到初始状态,构造问题的最优解。

动态规划的应用实例:

  • 背包问题:给定一组物品和一个背包,确定在不超过背包容量的前提下,背包中物品的最优组合。
  • 最长公共子序列:找出两个序列的最长公共子序列。
  • 最短路径问题:在加权图中找到从起点到终点的最短路径。
  • 矩阵链乘问题:计算矩阵序列的最优乘法顺序,以最小化总的标量乘法次数。

动态规划是一种强大的算法设计技术,适用于解决多种复杂问题,但需要仔细分析问题的结构,以确定是否可以应用动态规划方法。

题解

  1. 解题思路:
  1. 理解问题 给定一个正整数 n,目标是找到和为 n 的完全平方数的最少数量。完全平方数是指可以表示为某个整数的平方的数,例如 1, 4, 9, 16 等。

  2. 动态规划方法 这个问题可以通过动态规划(DP)来解决。我们定义一个数组 dp,其中 dp[i] 表示数字 i 可以由完全平方数相加得到的最少数量。

  3. 初始化 DP 数组 dp[0] 初始化为 0,因为和为 0 的最少数量是 0(不需要任何数)。 对于所有其他的 i,初始化 dp[i] 为一个非常大的数(例如 INT_MAX),表示暂时无法由完全平方数相加得到。

  4. 填充 DP 数组 对于每个 i 从 1 到 n,我们遍历所有可能的完全平方数 j * j(其中 j * j <= i),并更新 dp[i] 为 min(dp[i], dp[i - j*j] + 1)。这表示我们尝试用尽可能少的完全平方数来达到数字 i。

  5. 处理边界情况 确保处理所有可能的完全平方数,包括 1(因为 1 是最小的完全平方数,且经常出现在最优解中)。 考虑所有小于或等于 i 的完全平方数

  6. 返回结果 最终,dp[n] 将包含和为 n 的完全平方数的最少数量

  1. c++ demo:
#include <iostream>
#include <vector>
#include <climits>
#include <cmath>// 动态规划求解和为n的完全平方数的最少数量
int numSquares(int n) {std::vector<int> dp(n + 1, INT_MAX);dp[0] = 0;for (int i = 1; i <= n; ++i) {int sqrt_val = static_cast<int>(std::sqrt(i));for (int j = 1; j <= sqrt_val; ++j) {dp[i] = std::min(dp[i], dp[i - j * j] + 1);}}return dp[n];
}// 主函数,用于测试
int main() {int n = 12; // 可以修改这个值来测试不同的输入std::cout << "The least number of perfect square numbers which sum to " << n << " is: " << numSquares(n) << std::endl;return 0;
}
  • 输出结果:

The least number of perfect square numbers which sum to 12 is: 3

  1. 代码仓库:numSquares

http://www.ppmy.cn/server/111994.html

相关文章

配置vscode终端自动激活anaconda的python环境

前言 每次使用vscode写python代码的时候&#xff0c;都需要在外面跑一个anaconda prompt&#xff0c;激活环境&#xff0c;然后进入对应的文件夹&#xff0c;运行代码&#xff0c;特别麻烦&#xff0c;所以想&#xff0c;能不能直接在vscode终端里面激活环境然后运行。 第一步…

怎么检测电脑的RAM?丨什么是RAM?

RAM 是 Random Access Memory 的缩写&#xff0c;它是一个允许计算机短期存储数据以更快访问的组件。众所周知&#xff0c;操作系统、应用程序和各种个人文件都存储在硬盘驱动器中。 当 CPU 需要调用硬盘上的数据进行计算和运行时&#xff0c;CPU 会将数据传输到 RAM 中进行计…

深入解析:Nginx 负载均衡中的请求日志配置与优化

在Nginx负载均衡的配置中&#xff0c;请求日志的记录是一个关键环节&#xff0c;它不仅帮助我们监控流量模式&#xff0c;还能在出现问题时提供调试信息。本文将详细介绍如何在Nginx中配置请求日志&#xff0c;包括日志格式的自定义、日志文件的管理以及日志的优化策略。 1. N…

Java | Leetcode Java题解之第391题完美矩形

题目&#xff1a; 题解&#xff1a; class Solution {public boolean isSubsequence(String s, String t) {int n s.length(), m t.length();int[][] f new int[m 1][26];for (int i 0; i < 26; i) {f[m][i] m;}for (int i m - 1; i > 0; i--) {for (int j 0; j…

有哪些方法可以帮助游戏公司降低买量成本?

优化广告投放渠道选择&#xff1a; 关注头部媒体动态&#xff1a;主流的广告平台如巨量引擎、腾讯广告、百度信息流等是游戏买量的重要渠道&#xff0c;但这些平台上的媒体资源也有差异。实时关注各头部媒体的用户增长、活跃度等数据变化&#xff0c;比如某个时间段内某一媒体…

输电线路分布式故障诊断系统:分布式智慧网络的构建

输电线路分布式故障诊断系统&#xff1a;分布式智慧网络的构建 今天&#xff0c;就让深圳鼎信智慧科技陪大家一起走进输电线路分布式故障定位系统的世界&#xff1a; 1、系统架构&#xff1a;分布式智慧网络的构建 输电线路分布式故障定位系统主要由三大核心部分组成&#x…

无人机研学项目技术详解

无人机&#xff0c;全称无人驾驶飞机&#xff0c;是一种利用无线电遥控设备和自备的程序控制装置操纵的不载人飞行器。近年来&#xff0c;随着航空技术、计算机技术、材料科学等领域的飞速发展&#xff0c;无人机技术取得了突破性进展&#xff0c;广泛应用于航拍、农业、环境监…

C#中通过TabControl控制MDI子窗体显示切换的实现过程

类似excel表格中各个表单sheet的切换效果&#xff0c;使用tabcontrol控件实现类似的功能。效果如下&#xff1a; 过程涉及父窗体MDIParent1、子窗体main、自定义基础功能类MdiChildBase。 基础功能类MdiChildBase继承自Form创建&#xff0c;定义了一个委托SetTabControlDelega…