leetcode_260. Single Number III 数组中找出两个只出现一次的元素

题目:

Given an array of numbers nums, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.

For example:

Given nums = [1, 2, 1, 3, 2, 5], return [3, 5].

Note:

  1. The order of the result is not important. So in the above example, [5, 3] is also correct.
  2. Your algorithm should run in linear runtime complexity. Could you implement it using only constant space complexity?

题意:

给定数组nums,其中只有两个元素出现一次,其他元素都出现两次,写一个函数,找出这两个只出现一次的元素。

要求用线性时间复杂度,同时只使用常数个空间单元。


代码:

class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        
        n = len(nums)
        
        if n <= 2 :
            return nums
        else :
            nums.sort()     #对nums排序
            
            count = 0      #记录出现一次的元素个数
            res = []     #存储出现一次的元素
            i = 0
            while i < n-1 :
                if nums[i] == nums[i+1] :
                    i += 2
                else :
                    res.append(nums[i])
                    count += 1
                    i += 1
                if count == 2 :
                    return res
            
            res.append(nums[n-1])      #如果此时还没有返回,说明另一个只出现一次的元素在数组的最后一个位置
            return res

笔记:

表示时间复杂度不符合要求,但是该方法的运行时间真是挺快的

网上查看了其他大神的算法,大多是用按位异或运算,然后根据异或结果反推出两个只出现一次的元素的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值