136. Single Number (只出现一次的数字)
大家好,我是一个喜欢研究算法、机械学习和生物计算的小青年,我的CSDN博客是:一骑代码走天涯
如果您喜欢我的笔记,那么请点一下关注、点赞和收藏。如果內容有錯或者有改进的空间,也可以在评论让我知道。😄
题目描述
这道题目先给一 个非空整数列表,当中除了一个数项,其它数项都必定出现两次。现在我们要找出只出现一次的那个数项。
下面我提供了三个解法,它们的时间复杂度和空间复杂度皆不同。
题目原文(英语)
Given a non-empty array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
Example 1:
Input: [2,2,1]
Output: 1
Example 2:
Input: [4,1,2,1,2]
Output: 4
解题方式(一)
这个是最直观的:把所有数项都用list
方法中的count
数数量,找出只有一个的数项。缺点是count
这个方法本身就需要 O(n),所以时间复杂度高。
时间复杂度:O(n2)
空间复杂度: O(1)
class Solution:
def singleNumber(self, nums: List[int]) -> int:
for i in nums:
if nums.count(i) == 1:
return i
解题方式(二)
这个首先把数列排序,然后再找出和相邻没有重复的那个数项。因为用了python排序,所以时间复杂度是需要 O(n log n)。
时间复杂度:O(n2)
空间复杂度: O(1)
class Solution:
def singleNumber(self, nums: List[int]) -> int:
nums.sort()
count = 0
tmp = ""
for i in nums:
if i != tmp and count == 1:
return tmp
elif i == tmp:
count = 0
elif i != tmp:
tmp = i
count = 1
return i
解题方式(三)
这个方法最快,也省了空间。就只是利用了 bit operation 的 XOR 的特性,把所有的数项XOR之后就只剩没有重复的那个。
时间复杂度:O(n)
空间复杂度: O(1)
class Solution:
def singleNumber(self, nums: List[int]) -> int:
ans = 0
for i in nums:
ans ^= i
return ans