剑指 Offer 03. 数组中重复的数字
发布日期:2021-05-18 05:02:45 浏览次数:22 分类:精选文章

本文共 1060 字,大约阅读时间需要 3 分钟。

题目描述

本题要求找出 vector 中重复出现的数字。方法一和方法二分别提供了两种不同的解决方案。

方法一:使用 set

思路

通过定义一个 set 来记录已遍历过的数字。遍历 vector nums 中的每一个数字,如果当前数字已经存在于 set 中,则它即为重复数字;反之,将其添加到 set 中并继续下一个数字的检查。这种方法的时间复杂度为 O(n),因为set的查找和插入操作均为 O(1)的平均时间复杂度。

代码

class Solution {
public:
int findRepeatNumber(vector
& nums) {
set
s;
for (int i = 0; i < nums.size(); ++i) {
if (s.find(nums[i]) != s.end()) {
return nums[i];
} else {
s.insert(nums[i]);
}
}
return -1;
}
};

方法二:暴力搜索(会超时)

思路

通过双重循环检查每个数字是否与后续数字重复。这种方法虽然简单,但在最坏情况下(如所有数字均为重复数)动作复杂度为 O(n²),因此适用于小数据量的场景。此方法缺点明显,当数据规模较大时可能导致超时。

代码

class Solution {
public:
int findRepeatNumber(vector
& nums) {
for (int i = 0; i < nums.size(); ++i) {
for (int j = i + 1; j < nums.size(); ++j) {
if (nums[i] == nums[j]) {
return nums[i];
}
}
}
return -1;
}
};

总结

这两种方法各有优劣。方法一的时间复杂度更高效,适合大规模数据;方法二则简单易懂,但可能在大数据情况下表现不佳。

上一篇:剑指 Offer 04. 二维数组中的查找
下一篇:1025. 除数博弈

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月21日 03时04分53秒