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

相关推荐
水云桐程序员17 小时前
C++可以写手机应用吗
开发语言·c++·智能手机
平凡但不平庸的码农17 小时前
Go Slice 详解
算法·golang
Jasmine_llq21 小时前
《B3867 [GESP202309 三级] 小杨的储蓄》
算法·循环遍历·数组累加(模拟)·索引定位·顺序输出
啦啦啦_999921 小时前
案例之 逻辑回归_电信用户流失预测
算法·机器学习·逻辑回归
风筝在晴天搁浅21 小时前
快手/字节 CodeTop LeetCode 415.字符串相加
算法·leetcode
小黄人软件21 小时前
C++读写编辑CSV文件示例源码 用于数据导入导出,比Excel好使
开发语言·c++·excel
郭涤生21 小时前
C++各个版本的性能和安全性总结
开发语言·c++
DragonnAi1 天前
猫咪如厕检测与分类识别系统系列【十四】 项目结构重新整理-即将开源完整算法
算法·开源
机器视觉_Explorer1 天前
【halcon】编程技巧:鼠标擦除
图像处理·人工智能·深度学习·算法·视觉检测
wljy11 天前
二、静态库的制作和使用
linux·c语言·开发语言·c++