概述
题目 剑指 Offer 03. 数组中重复的数字
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
考察的是程序员的沟通能力,先问面试官要时间/空间需求!
只是时间优先就用字典,
还有空间要求,就用指针+原地排序数组,
如果面试官要求空间O(1)并且不能修改原数组,还得写成二分法!!
方法一:排序比较法,时间O(nlogn),空间O(1)。修改原数据。先排序,然后看相邻元素是否有相同的,有直接return。
class Solution:
def findRepeatNumber(self, nums: List[int]) -> int:
nums.sort()
pre = nums[0]
n = len(nums)
for index in range(1, n):
if pre == nums[index]:
return pre
pre = nums[index]
方法二:集合法:时间O(n),空间O(n),不修改原数据
构建一个新的空集合,然后依次添加元素,当发现某个元素已存在时,则说明该元素重复了。具有普适性,也可用字典替换集合,本质相同。
class Solution:
def findRepeatNumber(self, nums: List[int]) -> int:
repeatDict = {}
for num in nums:
if num not in repeatDict:
repeatDict[num] = 1
else:
return num
方法三:原地哈希法,时间O(n),空间O(1),修改原数据。
因为所有的元素都小于len(nums),所以可以让位置i放置元素值i,如果位置i的元素值不是i,则可以交换nums[i]与nums[nums[i]],这样nums[i]的值就被正确归位了,继续交换直到位置[i]也被正确交换了。如果我们发现nums[i]与nums[nums[i]]的值一致,则发现了重复的元素,返回即可。针对性较强,普适性较弱。时间复杂度的算法:因为每交换一次数组位置,至少有一个元素被放到了该元素值对应的下标的位置,至多2个,所有有n个元素,最坏的考虑就是需要操作n次。所以是O(n)
class Solution:
def findRepeatNumber(self, nums: List[int]) -> int:
repeatDict = {}
for num in nums:
if num not in repeatDict:
repeatDict[num] = 1
else:
return num
方法四:二分查找,时间O(nlongn),空间O(1),不修改原数据。
对0到n-1进行二分查找,时间O(nlogn),空间O(1),不修改原数据,用时间换空间
//该方法需要数字一定有重复的才行,因此如果题目修改在长度为n,数字在1到n-1的情况下,此时数组中至少有一个数字是重复的,该方法可以通过。
class Solution:
def findRepeatNumber(self, nums:List[int]) -> int:
# 注意初始值是1
min_value = 1
max_value = len(nums) - 1
while (max_value > min_value):
mid_value = (max_value + min_value) // 2
counts = self.countNums(nums, min_value, mid_value);
if counts > mid_value - min_value + 1:
max_value = mid_value
else:
# 注意这个地方需要加1,不然最后会陷入死循环,比如最后max_value为2,min_value为1,则会一直循环,对应的上面也可以给max_value复制的地方减1
min_value = mid_value + 1
# 跳出循环的条件一定是max_value = min_value
return min_value
def countNums(self, nums, min_value, max_value):
count = 0
for ele in nums:
if min_value <= ele <= max_value:
count += 1
return count
最后
以上就是悦耳中心为你收集整理的leetcode之小白python起步笔记——重复字符的全部内容,希望文章能够帮你解决leetcode之小白python起步笔记——重复字符所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复