LeetCode:137. 只出现一次的数字 II
LeetCode:137. 只出现一次的数字 II
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,3,2]
输出: 3
示例 2:
输入: [0,1,0,1,0,1,99]
输出: 99
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/single-number-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
方法一:哈希统计
此方法比较直观、简单,但需要使用线性大小的空间。
- 算法
- 第一遍历整数数组,使用哈希表统计每个整数出现的次数
- 第二遍遍历哈希表,返回哈希值为1对应的键
- 代码
int singleNumber(vector<int>& nums) {
unordered_map<int,int> kv;
for(int i=0; i<nums.size(); i++)
kv[nums[i]]++;
for(auto it: kv)
if(it.second==1)
return it.first;
return 0;
}
- 时空分析
- 时间复杂度:两边遍历,复杂度为O(n)
- 空间复杂度:使用哈希表,复杂度为O(n)
方法二:按位模三统计比特位上1的个数
模三统计每个比特位上1出现的个数,需要2个比特位。因此,可以使用两个int型整数去统计所有比特位上1的个数。记b[i]为整数的第i个比特位,则b2[i]b1[i]可表示第i个比特位上1出现的个数(模三)。b2[i]b1[i]=b'01'表示该位总计出现3*x+1次1,+1那次即由只出现一次的整数贡献,因此,只出现一次的整数等于b1&~b2。
- 算法
- 初始化:b1=0,b2=0
- 迭代整数数组,模三统计数组所有元素所有比特位上1的个数。
- 使用式子b1&~b2计算出出现次数为1的整数
- 代码
int singleNumber(vector<int>& nums) {
int b1=0, b2=0, b3=0;
for(int i=0; i<nums.size(); i++){
//做加法
b2 = nums[i]&b1^b2;
b1 = nums[i]^b1;
//模3
int sign=b1&b2;
b1=b1^sign;
b2=b2^sign;
}
return b1&~b2;
}
- 时空分析
- 时间复杂度:遍历一遍,复杂度为O(n)
- 空间复杂度:使用常数个变量,复杂度为O(1)
LeetCode:137. 只出现一次的数字 II的更多相关文章
- Leetcode 137. 只出现一次的数字 II - 题解
Leetcode 137. 只出现一次的数字 II - 题解 137. Single Number II 在线提交: https://leetcode.com/problems/single-numb ...
- Java实现 LeetCode 137 只出现一次的数字 II(二)
137. 只出现一次的数字 II 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空 ...
- Leetcode 137.只出现一次的数字II
只出现一次的数字II 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? ...
- LeetCode 137. 只出现一次的数字 II(Single Number II)
题目描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: ...
- [LeetCode] 137. 只出现一次的数字 II
题目链接 : https://leetcode-cn.com/problems/single-number-ii/ 题目描述: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三 ...
- 【LeetCode】137. 只出现一次的数字 II(剑指offer 56-II)
137. 只出现一次的数字 II(剑指offer 56-II) 知识点:哈希表:位运算 题目描述 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 .请你找出并返回 ...
- [LeetCode] 137. 只出现一次的数字,其余三次 II ☆☆☆
描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: 输 ...
- Java实现 LeetCode 137 只出现一次的数字
public static int singleNumber(int[] nums) { int res = 0; for(int i=0;i<nums.length;i++) res ^= n ...
- 137. 只出现一次的数字 II
2021-04-30 LeetCode每日一题 链接:https://leetcode-cn.com/problems/single-number-ii/ 方法1:使用map记录每个数出现的次数,再找 ...
随机推荐
- 【k8s 硬盘监控】prometheus grafana
设置监控哪块盘: https://www.bountysource.com/issues/50160777-disk-space-usage-depcited-in-grafana-correct h ...
- LODOP打印table超宽用省略号带'-'的内容换行问题
前面的博文有div超宽隐藏(LODOP打印超过后隐藏内容样式),还有有table设置超宽隐藏(),此外,还有超宽后用省略号表示的css样式,此文是针对这个样式的.该样式正常情况下没问题,但是遇到-短线 ...
- Nginx日志挂载目录为nfs文件服务器时开机无法自启动的问题解决
为了方便收集查看日志把nginx日志输出至nfs文件服务器,nfs文件服务器使用autofs自动挂载,nginx和autofs都使用systemctl设置了开机自启动. 但是在重启主机的时候nginx ...
- AI - TensorFlow - 示例04:过拟合与欠拟合
过拟合与欠拟合(Overfitting and underfitting) 官网示例:https://www.tensorflow.org/tutorials/keras/overfit_and_un ...
- 利用ldirectord实现lvs后端realserver健康状态检查
ldirectord用来实现LVS负载均衡资源在主.备节点间的故障转移.在首次启动时,ldirectord可以自动创建IPVS表.此外,它还可以监控各RealServer的运行状态,一旦发现某Real ...
- 预训练中Word2vec,ELMO,GPT与BERT对比
预训练 先在某个任务(训练集A或者B)进行预先训练,即先在这个任务(训练集A或者B)学习网络参数,然后存起来以备后用.当我们在面临第三个任务时,网络可以采取相同的结构,在较浅的几层,网络参数可以直接加 ...
- C++ 宏和模板简介
参考<21天学通C++>第14章节,对C++中的宏和模板进行了学习,总结起来其主要内容如下: (1) 预处理器简介 (2) 关键字#define与宏 (3) 模板简介 (4) 如何编写函数 ...
- 关于反向生成url
1.模板渲染 <form action="{% url "bieming" 参数 %}" > <input type="text&q ...
- 第07组 Alpha冲刺(4/4)
队名:秃头小队 组长博客 作业博客 组长徐俊杰 过去两天完成的任务:学习了很多东西 Github签入记录 接下来的计划:继续学习 还剩下哪些任务:后端部分 燃尽图 遇到的困难:自己太菜了 收获和疑问: ...
- hdoj4099(字典树+高精度)
题目链接:https://vjudge.net/problem/HDU-4099 题意:给T组询问,每个询问为一个字符串(长度<=40),求以该字符串为开始的fibonacci数列的第一个元素的 ...