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 <= numsi <= 231 - 1 −231<=numsi<=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

相关推荐
极序时代GEO品牌优化8 分钟前
杭州极序时代|面向地域、设备与用户画像的动态GEO
人工智能·python·算法·极序时代geo
mlidongfeng27 分钟前
[AI][C++26] SIMD 编程模型思考
开发语言·c++·人工智能
梓䈑28 分钟前
【用 Vibe Coding 实现的 C++17 在线判题系统】OpenCode 入门指南:从环境搭建到上下文管理
c++·ai编程
j7~28 分钟前
【Linux】二十七.线程篇四《Linux多线程编程:线程互斥(互斥量的底层到封装)、线程安全和冲入、死锁》---详解
linux·开发语言·c++·线程安全·死锁·线程互斥·重入
啦啦啦啦啦zzzz35 分钟前
贪心算法和动态规划
c++·算法·贪心算法·动态规划
happyprince1 小时前
篇3:bitsandbytes-深刻观-哲学与升华
人工智能·算法
我不是懒洋洋1 小时前
从零实现一个分布式数据集成:Airbyte的核心设计
c++
应用市场1 小时前
红绿灯背后的算法:从 Webster 配时到 Max-Pressure 与强化学习
算法
用户0510122572961 小时前
DAY 5-智能指针与 C++ 内存管理
c++·面试
木井巳1 小时前
【DFS解决floodfill算法】岛屿的最大面积
java·算法·leetcode·深度优先