标签:加法 cond 实现 sign 变量 ble 方法 时间复杂度 str
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 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出现的个数,需要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)
标签:加法 cond 实现 sign 变量 ble 方法 时间复杂度 str
原文地址:https://www.cnblogs.com/cwcheng/p/11247435.html