返回

C++刷题练习:找出只出现一次的数字(LeetCode 136)

前端

引言:

在软件开发和数据分析领域,处理大数据集并从中提取有价值的见解至关重要。一个常见的挑战是找出在一个包含重复元素的数据集中的唯一元素。在本文中,我们将探讨一个解决此问题的著名算法,即“只出现一次的数字”(LeetCode 136)。

问题陈述:

给定一个非空整数数组 nums,除了一个元素只出现一次以外,其余每个元素均出现两次。你的任务是找出那个只出现了一次的元素。

算法:

我们的算法依赖于位运算的技巧。位运算可以高效地执行布尔操作和比较,对于解决诸如本问题之类的特定场景非常有用。

该算法的工作原理如下:

  1. 初始化哈希表: 创建一个哈希表来跟踪每个元素在数组中的出现次数。
  2. 遍历数组: 遍历给定的数组,并为每个遇到的元素执行以下操作:
    • 如果元素已经在哈希表中,则将出现的次数增加 1。
    • 否则,将元素添加到哈希表,出现的次数设为 1。
  3. 查找唯一元素: 遍历哈希表,找出出现次数为 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;  // 不应该达到这一点
}

结论:

“只出现一次的数字”算法是一个高效且简单的解决方法,可用于找出非空整数数组中只出现一次的元素。它的线性时间复杂度使其在处理大数据集时特别有用。希望本文为您深入了解算法设计和复杂度分析提供帮助。通过持续的练习和探索,您可以掌握解决类似问题的强大技术。