2310-个位数字为 K 的整数之和

Raphael Liu Lv10

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

  • 每个整数个位数字都是 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

方法一:枚举集合的大小

思路与算法

当 num} = 0 时,唯一的方法是选择一个空集合,答案为 0。

当 num} > 0 时,我们可以发现最多不会选择超过 10 个数。这是因为如果这些数的个位数字为 k,并且我们选择了至少 11 个数,由于 11k 的个位数字也为 k,那么我们可以把任意的 11 个数合并成一个,使得选择的数仍然满足要求,并且集合更小。

因此,我们可以枚举选择的数的个数 i。由于每个数最小为 k,那么这 i 个数的和至少为 i \cdot k。如果 i \cdot k > \textit{num,那么无法满足要求,否则这 i 个数的和的个位数字已经确定,即为 i \cdot k \bmod 10。我们需要保证其与 num 的个位数字相同,这样 num} - i \cdot k 就是 10 的倍数,我们把多出的部分加在任意一个数字上,都不会改变它的个位数字。

代码

[sol1-C++]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public:
int minimumNumbers(int num, int k) {
if (num == 0) {
return 0;
}
for (int i = 1; i <= 10; ++i) {
if (k * i <= num && (num - k * i) % 10 == 0) {
return i;
}
}
return -1;
}
};
[sol1-Python3]
1
2
3
4
5
6
7
8
9
10
class Solution:
def minimumNumbers(self, num: int, k: int) -> int:
if num == 0:
return 0

for i in range(1, 11):
if k * i <= num and (num - k * i) % 10 == 0:
return i

return -1

复杂度分析

  • 时间复杂度:O(1)。

  • 空间复杂度:O(1)。

 Comments
On this page
2310-个位数字为 K 的整数之和