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)
原文地址:https://www.cnblogs.com/LQ6H/p/12940581.html