首页 > 其他分享 >260. 只出现一次的数字 III

260. 只出现一次的数字 III

时间:2023-10-17 12:55:29浏览次数:46  
标签:std count arr vector 数字 nums 复杂度 260 III

1.题目介绍

2.题解

2.1 快排+遍历

思路

同本系列前几题一样

代码

class Solution {
public:
    std::vector<int> singleNumber(std::vector<int>& nums) {
        int count = 0;
        std::vector<int> arr;
        std::sort(nums.begin(),nums.end());
        for (int i = 0; i < nums.size(); i++) {
            if (i == nums.size() - 1 && count == 0) {
                arr.push_back(nums[i]);
                if (arr.size() == 2) return arr;
            };
            if (nums[i] == nums[i+1]) count++;
            else if(count) count = 0;
            else {
                arr.push_back(nums[i]);
                if (arr.size() == 2) return arr;
            }
        }
        return arr;
    }
};

复杂度分析

  • 时间复杂度:
    排序阶段的时间复杂度为 \(O(nlog_n)\),其中 n 是输入数组的长度。
    查找单独出现数字的阶段是一个线性扫描,时间复杂度为 O(n)。
    总体来说,代码的时间复杂度为 \(O(nlog_n) + O(n) = O(nlog_n)\)。

  • 空间复杂度:
    代码的空间复杂度为 O(1)。

2.2 哈希表(牺牲空间)

思路

设计(数字,出现次数)的键值对,使用哈希表进行存储

代码

class Solution {
public:
    std::vector<int> singleNumber(std::vector<int>& nums) {
        std::vector<int> arr;
        std::unordered_map<int, int> map;
        for (int num: nums){
            map[num]++;
        }
        for (const auto& [num, occ]: map){
            if (occ == 1) arr.push_back(num);
        }
        return arr;
    }
};

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组 nums的长度。
  • 空间复杂度:O(n),即为哈希映射需要使用的空间。

2.3 位运算(分治算法)

思路

假设数组 nums 中只出现一次的元素分别是x1和x2,如果把 nums中的所有元素全部异或起来,得到结果 x,那么一定有:\(x=x_1\oplus x_2\)

x显然不会等于 0,因为如果 \(x=0\) , 那么说明 \(x_1=x_2\) ,这样 \(x_1\) 和 \(x_2\) 就不是只出现一次的数字了。因此,我们可以使用位运算 \(x \& -x\) 取出 \(x\) 的二进制表示中最低位那个 1, 设其为第\(l\) 位, 那么 \(x_1\) 和 \(x_2\) 中的某一个数的二进制表示的第 \(l\) 位为 0, 另一个数的二进制表示的第 \(l\) 位为 1。在这种情况下, \(x_1\oplus x_2\) 的二进制表示的第 \(l\) 位才能为 1。

这样一来,我们就可以把 \({nums}\) 中的所有元素分成两类,其中一类包含所有二进制表示的第 \(l\)位为 0 的数, 另一类包含所有二进制表示的第 \(l\) 位为 1 的数。可以发现:

  • 对于任意一个在数组 \(nums\) 中出现两次的元素, 该元素的两次出现会被包含在同一类中;
  • 对于任意一个在数组 \(nums\) 中只出现了一次的元素, 即 \(x_1\) 和 \(x_2\), 它们会被包含在不同类中。

这里其实就是一种分治算法的思想

标签:std,count,arr,vector,数字,nums,复杂度,260,III
From: https://www.cnblogs.com/trmbh12/p/17769434.html

相关文章

  • 260. 只出现一次的数字 III
    题目题解题解一直接使用HashSet判断classSolution{publicint[]singleNumber(int[]nums){Set<Integer>set=newHashSet<>();for(intnum:nums){if(set.contains(num)){set.remove(num);......
  • [LeetCode] 260. 只出现一次的数字 III
    题目给你一个整数数组nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。找出只出现一次的那两个元素。你可以按任意顺序返回答案。你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。思路可以用哈希表um映射存储每一个输入的值,输入一次就给......
  • JS 数字类型的加减乘除, 四舍五入保持精度
    Number.prototype.toFixed=function(d=0){ letchangeNum=this+''//把数字转为字符串 if(changeNum.indexOf('-')!=-1){//判断是否是负数 changeNum=Math.abs(Number(changeNum))} changeNum=(Math.round(Number(changeNum)*Math.......
  • 转载 | [AcSaveAsType -cad版本代号对应数字 ] & [AutoCAD的DWG文件格式版本代号列
    1. AcSaveAsType-cad版本代号对应数字 doc.SaveAs("D:\AutoCAD\1.dwg",61)#将当前文件另存为PyAutoCAD_SaveAs.dxf;#此时,程序关闭当前文件,将PyAutoCAD_SaveAs.dxf切换为当前文件。#61表示另存为文件的类型是AutoCAD2013DXF,常用类型如下:#12AutoCAD2000DWG(......
  • 山海鲸数字孪生解决方案:智慧水利管理的未来
    解决方案背景水资源的管理和利用对于人类社会的持续发展至关重要。随着全球气候变化、城市化进程和资源稀缺性的威胁日益增大,水利管理面临着前所未有的挑战。数字孪生技术,作为一项革命性的创新,为解决这些挑战提供了新的途径。山海鲸数字孪生技术以其独特的技术优势,为水利管理带来......
  • 数字电路硬件设计系列(十七)之上电时序控制电路
    1简介上电时序,也叫做Power-upSequence,是指电源时序关系。下面就是一系列电源的上电的先后关系:2方案介绍2.1电容实现延时采用不同的电容来控制上电延时时间的长短,具体的电路见下图:这种上电时序控制的方式,电路结构简单,但是延时时间难以精确的控制。在FPGA的电源......
  • 数字人论文:Audio-Driven Facial Animation by Joint End-to-End Learning of Pose an
    老规矩.直接第三章3.端到端网络结构给一个audio短窗口,也就是片段.我们预测窗口中间时刻的面部表情.我们把表情看做一个全端点的向量(后面我们会看这是什么的一种刻画面部)一旦我们网络训完,我们回各个时间点同时生成,并行.即使不需要过去的帧画面,依然生成很稳定的......
  • 137. 只出现一次的数字 II
    1.题目介绍2.题解2.1哈希表思路同本系列题I,不过多赘述代码classSolution{public:intsingleNumber(std::vector<int>&nums){std::unordered_map<int,int>map;for(intnum:nums){map[num]++;}for(autopair......
  • 137. 只出现一次的数字 II
    题目题解方法一直接用哈希表出现3次则从哈希表移除,最后剩下的就是结果classSolution{publicintsingleNumber(int[]nums){Map<Integer,Integer>map=newHashMap<>();for(intnum:nums){Integerinteger=map.getOrDe......
  • P2607 [ZJOI2008] 骑士
    P2607[ZJOI2008]骑士[P2607ZJOI2008]骑士-洛谷|计算机科学教育新生态(luogu.com.cn)目录P2607[ZJOI2008]骑士题目大意思路code题目大意给你一个\(n\)个点,\(n\)条边的基环树森林。你可以从中选择若干个点,满足两两之间不存在边相连。每个点有一个权值,请问最大的......