2026-03-10:缺失的最小倍数。用go语言,给定一个整数数组 nums 和一个整数 k,找出最小的正整数 m,满足两点:m
【摘要】 2026-03-10:缺失的最小倍数。用go语言,给定一个整数数组 nums 和一个整数 k,找出最小的正整数 m,满足两点:m 是 k 的倍数(即可表示为 k·t,t 为正整数),且 m 不出现在 nums 中。换言之,求最小的正整数 t(t ≥ 1),使得 k·t 不属于 nums。1 <= nums.length <= 100。1 <= nums[i] <= 100。1 <= k <=...
2026-03-10:缺失的最小倍数。用go语言,给定一个整数数组 nums 和一个整数 k,找出最小的正整数 m,满足两点:m 是 k 的倍数(即可表示为 k·t,t 为正整数),且 m 不出现在 nums 中。换言之,求最小的正整数 t(t ≥ 1),使得 k·t 不属于 nums。
1 <= nums.length <= 100。
1 <= nums[i] <= 100。
1 <= k <= 100。
输入: nums = [8,2,3,4,6], k = 2。
输出: 10。
解释:
当 k = 2 时,其倍数为 2、4、6、8、10、12……,其中在 nums 中缺失的最小倍数是 10。
题目来自力扣3718。
一、代码执行的详细过程
我们以输入 nums = [8,2,3,4,6]、k = 2 为例,分阶段拆解执行逻辑:
阶段1:初始化哈希表(map)并存储数组元素
- 函数
missingMultiple接收参数nums = [8,2,3,4,6]和k = 2后,首先创建一个空的布尔型哈希表has(键是整数,值表示该整数是否存在于 nums 中)。 - 遍历数组
nums中的每一个元素,将元素作为键存入哈希表,值设为true(表示该数存在):- 遍历到 8:
has[8] = true - 遍历到 2:
has[2] = true - 遍历到 3:
has[3] = true - 遍历到 4:
has[4] = true - 遍历到 6:
has[6] = true
最终哈希表has中存储的键值对为:8:true, 2:true, 3:true, 4:true, 6:true。
- 遍历到 8:
阶段2:查找缺失的最小 k 倍数
- 进入无限循环,初始值
x = k = 2,循环逻辑是每次将x增加k(即找下一个 k 的倍数),直到找到不在哈希表中的x。 - 第一次循环:
x = 2,检查has[2]→ 值为true(说明 2 在 nums 中),因此x += 2→x = 4。 - 第二次循环:
x = 4,检查has[4]→ 值为true(4 在 nums 中),x += 2→x = 6。 - 第三次循环:
x = 6,检查has[6]→ 值为true(6 在 nums 中),x += 2→x = 8。 - 第四次循环:
x = 8,检查has[8]→ 值为true(8 在 nums 中),x += 2→x = 10。 - 第五次循环:
x = 10,检查has[10]→ 哈希表中无此键,值为false(10 不在 nums 中),满足条件,返回x = 10。
阶段3:主函数执行
main函数中定义nums = [8,2,3,4,6]、k = 2,调用missingMultiple函数得到返回值 10。- 执行
fmt.Println(result),输出结果 10。
二、时间复杂度与空间复杂度分析
1. 时间复杂度
- 第一步(构建哈希表):遍历数组
nums,数组长度为n(本题中n = 5),这一步的时间复杂度是O(n)。 - 第二步(查找缺失倍数):最坏情况下需要遍历
m个 k 的倍数(m是找到缺失值前的 k 倍数个数),由于题目中nums[i]最大为 100,因此m最多不超过100/k + 1(是一个常数),这一步的时间复杂度可视为O(1)(常数时间)。 - 总时间复杂度:
O(n)(因为常数时间可忽略,核心复杂度由数组遍历决定)。
2. 额外空间复杂度
- 额外空间主要消耗在哈希表
has上,哈希表存储的键数量等于数组nums中不同元素的个数(本题中数组无重复元素,数量为n = 5)。 - 因此额外空间复杂度为
O(n)(n 为数组长度)。
总结
- 代码核心逻辑:先通过哈希表快速判断元素是否存在,再从 k 的 1 倍开始依次检查,找到第一个不在哈希表中的 k 倍数。
- 执行过程关键:哈希表的“存在性查询”是
O(1)时间,因此能高效找到缺失的最小倍数。 - 复杂度关键点:时间复杂度为
O(n)(n 为数组长度),额外空间复杂度为O(n)(哈希表存储数组元素)。
Go完整代码如下:
package main
import (
"fmt"
)
func missingMultiple(nums []int, k int) int {
has := map[int]bool{}
for _, x := range nums {
has[x] = true
}
for x := k; ; x += k {
if !has[x] {
return x
}
}
}
func main() {
nums := []int{8, 2, 3, 4, 6}
k := 2
result := missingMultiple(nums, k)
fmt.Println(result)
}

Python完整代码如下:
# -*-coding:utf-8-*-
from typing import List
def missingMultiple(nums: List[int], k: int) -> int:
has = set()
for x in nums:
has.add(x)
x = k
while True:
if x not in has:
return x
x += k
def main():
nums = [8, 2, 3, 4, 6]
k = 2
result = missingMultiple(nums, k)
print(result)
if __name__ == "__main__":
main()

C++完整代码如下:
#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;
int missingMultiple(vector<int>& nums, int k) {
unordered_set<int> has;
for (int x : nums) {
has.insert(x);
}
for (int x = k; ; x += k) {
if (has.find(x) == has.end()) {
return x;
}
}
}
int main() {
vector<int> nums = {8, 2, 3, 4, 6};
int k = 2;
int result = missingMultiple(nums, k);
cout << result << endl;
return 0;
}

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)