我是靠谱客的博主 悦耳中心,最近开发中收集的这篇文章主要介绍leetcode之小白python起步笔记——重复字符,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目 剑指 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起步笔记——重复字符所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部