LeetCode 137. 只出现一次的数字 II 中等

题目 - 点击直达

  • [1. 137. 只出现一次的数字 II 中等](#1. 137. 只出现一次的数字 II 中等)
    • [1. 题目详情](#1. 题目详情)
      • [1. 原题链接](#1. 原题链接)
      • [2. 题目要求](#2. 题目要求)
      • [3. 基础框架](#3. 基础框架)
    • [2. 解题思路](#2. 解题思路)
      • [1. 思路分析](#1. 思路分析)
      • [2. 时间复杂度](#2. 时间复杂度)
      • [3. 代码实现](#3. 代码实现)

1. 137. 只出现一次的数字 II 中等

1. 题目详情

1. 原题链接

LeetCode 137. 只出现一次的数字 II 中等

2. 题目要求

给你一个整数数组 n u m s nums nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。

示例 1:

输入:nums = [2,2,3,2]

输出:3
示例 2:

输入:nums = [0,1,0,1,0,1,99]

输出:99

提示:
1 < = n u m s . l e n g t h < = 3 ∗ 104 1 <= nums.length <= 3 * 104 1<=nums.length<=3∗104
− 231 < = n u m s [ i ] < = 231 − 1 -231 <= nums[i] <= 231 - 1 −231<=nums[i]<=231−1
n u m s nums nums 中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次

3. 基础框架

● Cpp代码框架

cpp 复制代码
class Solution {
public:
    int singleNumber(vector<int>& nums) {
    }
};

2. 解题思路

1. 思路分析

( 1 ) (1) (1) 哈希映射的思想,把 n u m s nums nums数组中出现的数唯一映射到 u n o r d e r e d m a p < i n t , i n t > unordered_map<int, int> unorderedmap<int,int>中,第二个参数记录其出现的次数;
( 2 ) (2) (2) 遍历 n u m s nums nums数组,并记录每个元素出现的次数;
( 3 ) (3) (3) 再次遍历 n u m s nums nums数组,判断每个元素在 u n o r d e r e d m a p < i n t , i n t > unordered_map<int, int> unorderedmap<int,int>中出现的次数:

  • 如果元素出现的次数是1,则返回该元素;
  • 反之则继续判断下一个元素,直到 n u m s nums nums末尾为止。

2. 时间复杂度

O ( N ) O(N) O(N)

遍历了两遍数组 n u m s nums nums,每次循环内进行的操作都是常数次,总体是 2 ∗ N 2*N 2∗N

3. 代码实现

哈希映射

cpp 复制代码
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        // 哈希映射
        unordered_map<int, int> m;
        for(auto& e : nums){
            m[e]++;
        }
        for(auto& e : nums){
            if(m[e] == 1){
                return e;
            }
        }
        return -1;
    }
};

暴力模拟

cpp 复制代码
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int one = 0, two = 1, three = 2;
        while(one < nums.size()){
            if(one == nums.size() - 1 
            || nums[one] != nums[two]){
                return nums[one];
            }
            one += 3;
            two += 3;
            three += 3;
        }
        return -1;
    }
};

通用模拟计数

cpp 复制代码
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int first = 0;
        int second = 0;
        int len = 0;
        while(second < nums.size()){
            if(nums[first] != nums[second]){
                if(len == 1){
                    break;
                }
                len = 0;
                first = second;
            }
            second++;
            len++;
        }
        return nums[first];
    }
};

T h e The The E n d End End

相关推荐
Remember_99313 小时前
【LeetCode精选算法】位运算专题一
java·开发语言·数据结构·leetcode·哈希算法
点云SLAM13 小时前
C++内存泄漏检测之编译期 /运行时工具(ASan/Valgrind)
开发语言·c++·内存管理·错误排查·内存泄漏检测工具·valgrind工具·asan工具
MicroTech202513 小时前
微算法科技(NASDAQ :MLGO)量子生成对抗网络(QGAN)技术,为网络安全防御提供了全新的技术路径
科技·算法·生成对抗网络
YuTaoShao13 小时前
【LeetCode 每日一题】3507. 移除最小数对使数组有序 I
算法·leetcode·职场和发展
陳103013 小时前
C++:多态
开发语言·c++
LYS_061813 小时前
RM赛事C型板九轴IMU解算(3)(姿态融合算法)
c语言·算法·imu·姿态解算·四元数到欧拉角
LDG_AGI13 小时前
【机器学习】深度学习推荐系统(三十一):X For You Feed 全新推荐系统技术架构深度解析
人工智能·深度学习·算法·机器学习·架构·推荐算法
tobias.b13 小时前
408真题解析-2010-5-数据结构-树的结点数量计算
数据结构·算法·408真题解析
Fcy64813 小时前
C++11 新增特性(上)
开发语言·c++·c++11·右值引用和移动语意
chilavert31813 小时前
技术演进中的开发沉思-329 JVM:垃圾回收(中)
java·jvm·算法