返回
C++刷题练习:找出只出现一次的数字(LeetCode 136)
前端
2023-10-13 12:44:43
引言:
在软件开发和数据分析领域,处理大数据集并从中提取有价值的见解至关重要。一个常见的挑战是找出在一个包含重复元素的数据集中的唯一元素。在本文中,我们将探讨一个解决此问题的著名算法,即“只出现一次的数字”(LeetCode 136)。
问题陈述:
给定一个非空整数数组 nums
,除了一个元素只出现一次以外,其余每个元素均出现两次。你的任务是找出那个只出现了一次的元素。
算法:
我们的算法依赖于位运算的技巧。位运算可以高效地执行布尔操作和比较,对于解决诸如本问题之类的特定场景非常有用。
该算法的工作原理如下:
- 初始化哈希表: 创建一个哈希表来跟踪每个元素在数组中的出现次数。
- 遍历数组: 遍历给定的数组,并为每个遇到的元素执行以下操作:
- 如果元素已经在哈希表中,则将出现的次数增加 1。
- 否则,将元素添加到哈希表,出现的次数设为 1。
- 查找唯一元素: 遍历哈希表,找出出现次数为 1 的元素。这个元素就是我们正在寻找的唯一元素。
复杂度分析:
- 时间复杂度:O(n),其中 n 是数组
nums
的长度。算法只遍历数组一次,而哈希表查找和插入操作是常数时间操作。 - 空间复杂度:O(n),因为哈希表最多存储 n 个唯一元素。
C++实现:
以下代码片段提供了该算法的 C++ 实现:
#include <unordered_map>
int singleNumber(vector<int>& nums) {
unordered_map<int, int> hashtable;
for (int num : nums) {
if (hashtable.find(num) != hashtable.end()) {
hashtable[num]++;
} else {
hashtable[num] = 1;
}
}
for (auto& pair : hashtable) {
if (pair.second == 1) {
return pair.first;
}
}
return -1; // 不应该达到这一点
}
结论:
“只出现一次的数字”算法是一个高效且简单的解决方法,可用于找出非空整数数组中只出现一次的元素。它的线性时间复杂度使其在处理大数据集时特别有用。希望本文为您深入了解算法设计和复杂度分析提供帮助。通过持续的练习和探索,您可以掌握解决类似问题的强大技术。