个位数字为 K 的整数之和

简介: 🎈每天进行一道算法题目练习,今天的题目是“个位数字为 K 的整数之和”。

说在前面

🎈每天进行一道算法题目练习,今天的题目是“个位数字为 K 的整数之和”。

问题描述

给你两个整数 num 和 k ,考虑具有以下属性的正整数多重集:

  • 每个整数个位数字都是 k 。
  • 所有整数之和是 num 。

返回该多重集的最小大小,如果不存在这样的多重集,返回 -1 。

注意:

  • 多重集与集合类似,但多重集可以包含多个同一整数,空多重集的和为 0 。
  • 个位数字 是数字最右边的数位。

 

示例 1:

输入: num = 58, k = 9
输出: 2
解释:
多重集 [9,49] 满足题目条件,和为 58 且每个整数的个位数字是 9 。
另一个满足条件的多重集是 [19,39] 。
可以证明 2 是满足题目条件的多重集的最小长度。

示例 2:

输入: num = 37, k = 2
输出: -1
解释: 个位数字为 2 的整数无法相加得到 37 。

示例 3:

输入: num = 0, k = 7
输出: 0
解释: 空多重集的和为 0 。

 

提示:

  • 0 <= num <= 3000
  • 0 <= k <= 9

思路分析

首先我们应该要先理解一下题意,题目给出两个参数,分别是:

  • k:我们可以使用的数 -> [0,3000]中个位数为k的数
  • num:我们需要使用[0,3000]中个位数为k的数组成的和

提取提示给出的信息:

  • 还有要注意的一点是:数字可以重复使用
  • 再看一下num的取值范围:0 <= num <= 3000

数据范围是0 <= num <= 3000,所以我们可以使用动态规划,求出0-3000中每一个数字可以组成的最少个数:\
我们可以总结出公式,dp[num] = dp[i] + dp[num - i] ---> dp[i] = dp[j] + dp[i - j],可以推出所有可能组成的数值需要使用数字的个数,具体步骤如下:

  • 1、统计个位数为k及其倍数的次数
let i = k;
let dp = new Array(num + 5).fill(0);
while(i <= num){
   if(i == 0) i += 10;
   if(i == num) return 1;
   for(let j = 1; j * i <= num; j++){
       dp[j * i] = j;
   }
   i += 10;
}
  • 2、求组成所求的值得最小个数
if(dp[num]) res = dp[num];
for(let i = 0; i <= num; i++){
   if(dp[i] && dp[num - i]) res = Math.min(dp[i] + dp[num - i],res);
}

AC代码

/**
 * @param {number} num
 * @param {number} k
 * @return {number}
 */
 var minimumNumbers = function(num, k) {
    if(num == 0) return 0;
   let i = k;
   let res = Infinity;
   let dp = new Array(num + 5).fill(0);
   dp[0] = 0;
   while(i <= num){
       if(i == 0) i += 10;
       if(i == num) return 1;
       for(let j = 1; j * i <= num; j++){
           dp[j * i] = j;
       }
       i += 10;
   }
   if(dp[num]) res = dp[num];
   for(let i = 0; i <= num; i++){
       if(dp[i] && dp[num - i]) res = Math.min(dp[i] + dp[num - i],res);
   }
   return res == Infinity ? -1 : res;
};

说在后面

🎉这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,平时也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。
目录
相关文章
|
SQL 监控 网络协议
线上故障如何快速排查?来看这套技巧大全
有哪些常见的线上故障?如何快速定位问题?本文详细总结工作中的经验,从服务器、Java应用、数据库、Redis、网络和业务六个层面分享线上故障排查的思路和技巧。较长,同学们可收藏后再看。
线上故障如何快速排查?来看这套技巧大全
|
数据安全/隐私保护
【洛谷 P1928】外星密码 题解(递归+字符串)
外星密码挑战涉及解压缩由重复子串压缩的字符串,如`[3FUN]`代表`FUNFUNFUN`。输入是一行压缩过的字符串,输出是解压缩的结果。代码使用递归方法,遇到`[`读取重复次数并解压下一层,遇到`]`返回当前层结果,否则直接添加字符。样例输入`AC[3FUN]`输出`ACFUNFUNFUN`。处理的数据限制为解压后长度在20000内,最多十重压缩。
337 0
|
11月前
|
JavaScript 前端开发 测试技术
盘点原生JavaScript中直接触发事件的方式
本文全面探讨了原生JavaScript中触发事件的多种方式,包括`dispatchEvent`、`Event`构造函数、`CustomEvent`构造器、直接调用事件处理器以及过时的`createEvent`和`initEvent`方法。通过技术案例分析,如模拟点击事件、派发自定义数据加载事件和实现提示框系统,帮助开发者掌握这些方法在实际开发中的应用,提升灵活性与兼容性。
398 3
|
人工智能 API 开发者
免费使用Kimi的API接口,kimi-free-api真香
今年AI应用兴起,各类智能体涌现,但API免费额度有限。为解决这一问题,GitHub上的[kimi-free-api](https://github.com/LLM-Red-Team/kimi-free-api)项目提供了方便,支持高速流式输出、多轮对话等,与ChatGPT接口兼容。此外,还有其他大模型的免费API转换项目,如跃问StepChat、阿里通义Qwen等。该项目可帮助用户免费体验,通过Docker-compose轻松部署。只需获取refresh_token,即可开始使用。这个开源项目促进了AI学习和开发,为探索AI潜力提供了新途径。
3301 3
|
uml
UML 类图几种关系(依赖、关联、泛化、实现、聚合、组合)及其对应代码
UML 类图几种关系(依赖、关联、泛化、实现、聚合、组合)及其对应代码
3525 0
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的太原学院在线考试系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的太原学院在线考试系统附带文章源码部署视频讲解等
144 1
|
机器学习/深度学习 编解码 固态存储
目标检测Neck(1)——多尺度问题(FPN)
目标检测Neck(1)——多尺度问题(FPN)
849 0
|
Windows
Windows Server 2012 R2多用户远程连接配置步骤
Windows Server 2012 R2多用户远程连接配置步骤
1062 0