题目
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
注:时间复杂度不能超过n2,空间复杂度为1。
思考
法一:遍历数组将每个数对应的索引上的数加上n(n>=数组长度),依次遍历,如果值作为索引时大于n则需减去n,再将得到的值作为索引,得到索引对应的值,如果该值大于n则说明该数出现过,输出即可。
法二:使用位运算(异或)
实现
class Solution:
def findRepeatNumber(self, nums: List[int]) -> int:
n = len(nums)
for i in range(len(nums)):
index = nums[i]
if index < n:
if nums[index] < n:
nums[index] += n
else:
return nums[i]
else:
if nums[index-n] < n:
nums[index-n] += n
else:
return nums[i]-n
class Solution:
def findRepeatNumber(self, nums: List[int]) -> int:
n = 0
for i in nums:
if n & (1 << i) != 0:
return i
else:
n |= (1 << i)
链接:https://leetcode-cn.com/problems/rectangle-area