LeetCode算法题解(动态规划)|LeetCode322. 零钱兑换、LeetCode279. 完全平方数

本文主要是介绍LeetCode算法题解(动态规划)|LeetCode322. 零钱兑换、LeetCode279. 完全平方数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、LeetCode322. 零钱兑换

题目链接:322. 零钱兑换
题目描述:

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。

你可以认为每种硬币的数量是无限的。

示例 1:

输入:coins = [1, 2, 5], amount = 11
输出:3 
解释:11 = 5 + 5 + 1

示例 2:

输入:coins = [2], amount = 3
输出:-1

示例 3:

输入:coins = [1], amount = 0
输出:0

提示:

  • 1 <= coins.length <= 12
  • 1 <= coins[i] <= 231 - 1
  • 0 <= amount <= 104
算法分析:

题目给出硬币的数量无限,所以这是一道完全背包问题。

定义dp数组及下标含义:

dp[j]表示凑成金额为j所需的硬币最少个数。

递推公式:

dp[j]=min(dp[j],dp[j-coins[i]]+1),现有硬币coins[i],那么凑成金额为j所需的最少硬币数可有凑成金额为j-coins[i]所需最少硬币数推出。

初始化:

因为要求的是最少硬币数,所以除dp[0]初始化成0之外,其他所有情况都要初始化成最大值。

遍历顺序:

先遍历不同面额的硬币,在遍历总金额。

打印dp数组进行验证。

代码如下:

class Solution {public int coinChange(int[] coins, int amount) {int[] dp = new int[amount + 1];for(int i = 1; i < amount + 1; i++) dp[i] = Integer.MAX_VALUE;dp[0] = 0;//除了dp[0]其他都初始化成最大值for(int i = 0; i < coins.length; i++) {//遍历每种硬币for(int j = coins[i]; j <= amount; j++) {//遍历总金额if(dp[j - coins[i]] != Integer.MAX_VALUE) {//注意如果dp[j-coins[i]]是个最大int类型整数的话,dp[j-coins[i]]+1会溢出,变成负数,从而影响比较结果,所以只有它不是初始最大值是,才有选择的必要。dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1);}}}return dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount];}
}

二、LeetCode279. 完全平方数

题目链接:279. 完全平方数
题目描述:

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

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

示例 1:

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

示例 2:

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

 

提示:

  • 1 <= n <= 104
算法分析:

因为每个完全平方数可以无限取,所以这也是一道完全背包问题。

定义dp数组及下标含义:

dp[j]表示组成和为j的完全平方数最少数量。

递推公式:

dp[j]=min(dp[j],dp[j-i*i]+1),现有完全平方数i*i,那么组成j的最少完全平方数数量可有dp[j-i*i]推导而出,也即组成j-i*i的最少完全平方数数量加上现在这个完全平方数(i*i)。

初始化:

因为要求的是完全平方数最少数量,所以除dp[0]初始化成0外,其他所有情况都要初始化成最大值。

遍历顺序:

先遍历小于等于目标和n的每个完全平方数,在遍历总和。

打印dp数组进行验证。

代码如下:

class Solution {public int numSquares(int n) {int[] dp = new int[n + 1];//除dp[0]意外,其他所有情况都初始化成最大值dp[0] = 0;for(int i = 1; i <= n; i++)dp[i] = Integer.MAX_VALUE;for(int i = 1; i * i <= n; i++) {//遍历每个完全平方数for(int j = i * i; j <= n; j++) {//遍历总和dp[j] = Math.min(dp[j],dp[j-i * i] + 1);}}return dp[n];}
}

总结

这两道题都是完全背包问题中,求最少元素个数的情况。

这篇关于LeetCode算法题解(动态规划)|LeetCode322. 零钱兑换、LeetCode279. 完全平方数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/423795

相关文章

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

Mybatis嵌套子查询动态SQL编写实践

《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言MyBATis的xml文件编写动态SQL

SpringBoot实现Kafka动态反序列化的完整代码

《SpringBoot实现Kafka动态反序列化的完整代码》在分布式系统中,Kafka作为高吞吐量的消息队列,常常需要处理来自不同主题(Topic)的异构数据,不同的业务场景可能要求对同一消费者组内的... 目录引言一、问题背景1.1 动态反序列化的需求1.2 常见问题二、动态反序列化的核心方案2.1 ht

golang实现动态路由的项目实践

《golang实现动态路由的项目实践》本文主要介绍了golang实现动态路由项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习... 目录一、动态路由1.结构体(数据库的定义)2.预加载preload3.添加关联的方法一、动态路由1

Python使用Reflex构建现代Web应用的完全指南

《Python使用Reflex构建现代Web应用的完全指南》这篇文章为大家深入介绍了Reflex框架的设计理念,技术特性,项目结构,核心API,实际开发流程以及与其他框架的对比和部署建议,感兴趣的小伙... 目录什么是 ReFlex?为什么选择 Reflex?安装与环境配置构建你的第一个应用核心概念解析组件

Python日期和时间完全指南与实战

《Python日期和时间完全指南与实战》在软件开发领域,‌日期时间处理‌是贯穿系统设计全生命周期的重要基础能力,本文将深入解析Python日期时间的‌七大核心模块‌,通过‌企业级代码案例‌揭示最佳实践... 目录一、背景与核心价值二、核心模块详解与实战2.1 datetime模块四剑客2.2 时区处理黄金法

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Python Selenium动态渲染页面和抓取的使用指南

《PythonSelenium动态渲染页面和抓取的使用指南》在Web数据采集领域,动态渲染页面已成为现代网站的主流形式,本文将从技术原理,环境配置,核心功能系统讲解Selenium在Python动态... 目录一、Selenium技术架构解析二、环境搭建与基础配置1. 组件安装2. 驱动配置3. 基础操作模

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四