码迷,mamicode.com
首页 > 其他好文 > 详细

137. 只出现一次的数字 II

时间:2019-07-25 23:18:21      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:加法   cond   实现   sign   变量   ble   方法   时间复杂度   str   

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

标签:加法   cond   实现   sign   变量   ble   方法   时间复杂度   str   

原文地址:https://www.cnblogs.com/cwcheng/p/11247435.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!