• Sword_Offer 数组中重复的数字[3]


    Sword_Offer 数组中重复的数字[3]

    题目一:找出数组中重复的数字

    0x00 题目描述

    在一个长度为n的数组里的所有数字都在0~n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复率几次.请找出数组中任意一个重复的数字.例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2后者3

    0x01 解题思路

    #!/usr/bin/env python3
    # -*- coding:utf-8 -*-
    # Author LQ6H
    
    class Solution:
        def duplicate(self,arr):
            """
            :param arr: List[int]
            :return: int
            """
            if not arr:
                return
    
            n=len(arr)
            res=0
    
            for i in range(n):
                if arr[i]<0 or arr[i]>n-1:
                    return
    
            for i in range(n):
                while arr[i]!=i:
    
                    if arr[i]==arr[arr[i]]:
                        res=arr[i]
                        return res
    
                    index=arr[i]
                    arr[i]=arr[index]
                    arr[index]=index
    
            return False
    

    0x02 性能分析

    • 时间复杂度:O(n)
    • 空间复杂度:O(1)

    0x03 测试用例

    • 1.长度为n的数组里包含一个或多个重复的数字
    • 2.数组中不包含重复的数字
    • 3.输入空列表或n之外的数字

    题目二:不修改数组找出重复的数字

    0x00 题目描述

    题目与上面类似,长度为n+1的数组里的所有数字都在1~n的范围内,唯一要求数组不能修改

    0x01 解题思路

    #!/usr/bin/env python3
    # -*- coding:utf-8 -*-
    # Author LQ6H
    
    class Solution:
        def getDuplication(self,arr):
            """
            :param arr: List[int]
            :return: int
            """
            if not arr:
                return -1
    
            start=1
            end=len(arr)-1
    
            while end>=start:
                middle=((end-start)>>1)+start
                count=self.countRange(arr,start,middle)
    
                if end==start:
                    if count>1:
                        return start
                    else:
                        break
    
                if count>(middle-start+1):
                    end=middle
                else:
                    start=middle+1
    
            return -1
    
        def countRange(self,arr,start,end):
            count=0
    
            for i in range(len(arr)):
                if arr[i]>=start and arr[i]<=end:
                    count+=1
    
            return count
    

    0x02 性能分析

    • 时间复杂度:O(n)
    • 空间复杂度:O(1)
  • 相关阅读:
    mysql GROUP_CONCAT 查询某个字段(查询结果默认逗号拼接)
    mysql中find_in_set的使用
    Libev源码分析07:Linux下的eventfd简介
    Libev源码分析06:异步信号同步化--sigwait、sigwaitinfo、sigtimedwait和signalfd
    Nova中的Hook机制
    Python深入:stevedore简介
    Libev源码分析05:Libev中的绝对时间定时器
    Python深入:setuptools简介
    Libev源码分析04:Libev中的相对时间定时器
    Libev源码分析02:Libev中的IO监视器
  • 原文地址:https://www.cnblogs.com/LQ6H/p/12940581.html
Copyright © 2020-2023  润新知