个位数字为 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,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,平时也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。
目录
相关文章
|
8月前
|
算法 前端开发
拆分数位后四位数字的最小和
拆分数位后四位数字的最小和
55 0
|
算法
【Leetcode -405.数字转换为十六进制数 - 409.最长回文串】
【Leetcode -405.数字转换为十六进制数 - 409.最长回文串】
49 0
|
7月前
|
存储 测试技术
1024 科学计数法 (20 分)
1024 科学计数法 (20 分)
|
5月前
|
C语言
用栈实现将一个十进制数值转换成八进制数值。即用该十进制数值除以8,并保留其余数;重复此操作,直到该十进制数值为0为止。最后将所有的余数反向输出就是所对应的八进制数值
这篇文章展示了如何使用栈(包括顺序栈和链栈)实现将十进制数值转换成八进制数值的方法,通过C语言编程演示了两种栈的实现方式和使用场景。
用栈实现将一个十进制数值转换成八进制数值。即用该十进制数值除以8,并保留其余数;重复此操作,直到该十进制数值为0为止。最后将所有的余数反向输出就是所对应的八进制数值
|
8月前
28.求任意一个整数的十位上的数字
28.求任意一个整数的十位上的数字
86 3
|
8月前
|
人工智能
PTA-求整数的位数及各位数字之和
求整数的位数及各位数字之和
78 4
【剑指offer】-数值的整数次方-12/67
【剑指offer】-数值的整数次方-12/67
|
8月前
打印2进制位数的奇数位和偶数位
打印2进制位数的奇数位和偶数位
wustojc求三位整数的逆序数
wustojc求三位整数的逆序数
61 0
打印整数二进制的奇数位和偶数位
打印整数二进制的奇数位和偶数位
63 0

热门文章

最新文章