137. 只出现一次的数字 II
Posted cwcheng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了137. 只出现一次的数字 II相关的知识,希望对你有一定的参考价值。
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.第一遍历整数数组,使用哈希表统计每个整数出现的次数
2.第二遍遍历哈希表,返回哈希值为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;
- 时空分析
1.时间复杂度:两边遍历,复杂度为O(n)
2.空间复杂度:使用哈希表,复杂度为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。
- 算法
1.初始化:b1=0,b2=0
2.迭代整数数组,模三统计数组所有元素所有比特位上1的个数。
3.使用式子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;
- 时空分析
1.时间复杂度:遍历一遍,复杂度为O(n)
2.空间复杂度:使用常数个变量,复杂度为O(1)
以上是关于137. 只出现一次的数字 II的主要内容,如果未能解决你的问题,请参考以下文章