LeetCode——只出现一次的数字

感谢:只出现一次的数字 [ LeetCode ]

线性时间复杂度:时间复杂度最高为O(n)

不使用额外空间:空间复杂度最高为O(1)

方法一:异或法(所有数字在二进制下相与结果为落单的数字)

 int singleNumber(vector<int>& nums) {
         
        int num = 0;
        for (int i = 0; i < nums.size(); i++) 
        {
            num = num ^ nums[i];
        }
        return num;
    }

方法二:(使用STL中set,当二次插入时set返回类型(pair)中提取false,删除set中元素。最后将只剩落单元素)

int singleNumber(vector<int>& nums) {

        set<int> has;
        for (int i = 0; i < nums.size(); i++) 
        {
            bool bo = has.insert(nums[i]).second;    //返回pair类型
            if (bo == false)
            {
                has.erase(nums[i]);
            }
        }
        for(auto m : has)
            return m;
    }

利用了HashSet集合不可重复的特性,其实HashSet的底层是通过HashMap来实现的。调用的 resize() 、 putTreeVal() 等方法本身也是O(n2)的时间复杂度。不符合题目要求的线性时间复杂度

方法三:(重新排序)

int singleNumber(vector<int>& nums) {
         
        sort(nums.begin(), nums.end());
        
        for (int i = 0; i < nums.size() - 1; i += 2) 
            if (nums[i] != nums[i + 1]) 
                return nums[i];
        return nums[nums.size() - 1];
    }

不符合题目要求的线性时间复杂度

猜你喜欢

转载自blog.csdn.net/goldcarpenter/article/details/83860146