LeetCode 136. Single Number 题解(C++)

LeetCode 136. Single Number 题解(C++)


题目描述

  • Given an array of integers, every element appears twice except for one. Find that single one.

限制条件

  • Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

思路

自己的解法

  • 这道题最困难的是要保证在时间复杂度为线性的条件下,还不能占用额外的空间,我的解法可以接近线性的时间复杂度(当然了,里面使用到了set容器,所以还要加上set中查找元素的时间,set查找的时间是logn)。
  • 这里创建了一个set容器用于保存遍历数组时仅出现一次的元素,若该元素出现第二次,则从容器中删除,于是遍历完该数组,数组剩下的仅有的唯一元素,就是只出现过一次的元素。

最佳解法

  • 最佳解法使用了异或位运算符,在线性的时间复杂度下同时保证了不占用额外的空间。我们举个例子:
    有两个数均为7,则两个数的二进制均为0111,两者异或,0111^0111=0000,结果为0,若有三个数7,5,7,则三者异或为0111^0101^0111=0101,结果为5,同理,对该数组所有的元素进行异或操作,出现两次的元素将抵消,最后剩下的结果就是只出现一次的元素。

代码

我的解法

class Solution 
{
public:
    int singleNumber(vector<int>& nums)
    {
        set<int> temp;
        set<int>::iterator result;
        for (int i = 0; i < nums.size(); ++i)
        {
            result = temp.find(nums[i]);
            if (result == temp.end())
            {
                temp.insert(nums[i]);
            }
            else
            {
                temp.erase(nums[i]);
            }
        }
        return *(temp.begin());
    }
};

最佳解法

class Solution 
{
public:
    int singleNumber(vector<int>& nums)
    {
        int result = 0;
        for (int i = 0; i < nums.size(); ++i)
        {
            result = result ^ nums[i];
        }
        return result;
    }
};

你可能感兴趣的:(LeetCode)