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

相关推荐
2501_9248785929 分钟前
强光干扰下漏检率↓78%!陌讯动态决策算法在智慧交通违停检测的实战优化
大数据·深度学习·算法·目标检测·视觉检测
JCBP_30 分钟前
QT(1)
开发语言·汇编·c++·qt
郝学胜-神的一滴1 小时前
C++ Core Guidelines 核心理念
开发语言·c++·设计模式·代码规范
耳总是一颗苹果1 小时前
排序---插入排序
数据结构·算法·排序算法
YLCHUP2 小时前
【联通分量】题解:P13823 「Diligent-OI R2 C」所谓伊人_连通分量_最短路_01bfs_图论_C++算法竞赛
c语言·数据结构·c++·算法·图论·广度优先·图搜索算法
minji...2 小时前
C++ string自定义类的实现
开发语言·c++
花火|2 小时前
算法训练营day62 图论⑪ Floyd 算法精讲、A star算法、最短路算法总结篇
算法·图论
GuGu20242 小时前
新手刷题对内存结构与形象理解的冲突困惑
算法
汤永红2 小时前
week4-[二维数组]平面上的点
c++·算法·平面·信睡奥赛
晴空闲雲3 小时前
数据结构与算法-字符串、数组和广义表(String Array List)
数据结构·算法