不修改数组找出重复的数字——Python实现

题目描述

给定一个长度为 n+1 的数组nums,数组中所有的数均在 1∼n 的范围内,其中 n≥1。
请找出数组中任意一个重复的数,但不能修改输入的数组。
样例:
给定长度为8的数组 nums = [2, 3, 5, 4,3, 2, 6,7]
那么输出重复的数字2或者3.

思路

  1. 跟上一题一样,同样可以采用哈希表的方法,依次扫描各元素,放入哈希表中,当元素已在哈希表中存在时,则找到了重复的数。此方法时间和空间复杂度均为O(n).
  2. 运用分治的思想,由题意:“所有数均在1~n的范围内,长度为n+1” 可知,必定存在重复数。首先将1 ~ n 这个区间分为两部分,前一部分包含数字1 ~ (1+n)/2, 后一部分包含数字(1+n)/2+1 ~ n, 统计第一部分元素个数,若个数大于(1+n)/2, 则第一部分存在重复数,否则,重复数在第二部分,然后,再继续将含有重复数字的区间一分为二,直至找到重复的数字。此方法时间复杂度为O(nlogn),空间复杂度为O(1).

参考代码

  • 思路1
def find_dup1(array):
    hash_map = dict()
    for i, val in enumerate(array):
        if val in hash_map:
            return True, val
        hash_map[val] = i
    return False, None
  • 思路2
def find_dupc(array):
    first = 1
    last = len(array) + 1
    while first != last:
        first, last = seperate(array, first, last)
    return True, first


def seperate(a, first, last):
    mid = (first + last) // 2
    count = 0
    for i in range(0, len(a)):
        if a[i] >= first and a[i] <= mid:
            count += 1
    if count > mid - first + 1:
        return first, mid
    else:
        return mid + 1, last
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章