不修改數(shù)組找出重復(fù)的數(shù)字

# 描述

在一個(gè)長(zhǎng)度為 n+1 的數(shù)組中所有的數(shù)字都在 1~n 范圍內(nèi),所以數(shù)組中至少有一個(gè)數(shù)字是重復(fù)的。
請(qǐng)至少找出數(shù)組中任意一個(gè)重復(fù)的數(shù)字,但不能修改輸入的數(shù)組。

# 思路

采用二分法查找,時(shí)間復(fù)雜度為 O(nlogn)

在數(shù)字 1~n 中取中間值 m = (1+n) / 2, 此時(shí)數(shù)字包括 1~m, m+1~n 兩段;
遍歷數(shù)組,獲得數(shù)字 1~m 的個(gè)數(shù);
如果數(shù)字 1~m 的個(gè)數(shù)大于 m,說(shuō)明 1~m 這一段內(nèi)肯定有重復(fù)數(shù)字,那么在這一段內(nèi)繼續(xù)取中間值比較;
如果數(shù)字 1~m 的個(gè)數(shù)等于 m,這一段不一定有重復(fù)數(shù)字,比較后一段;
如果數(shù)字 1~m 的個(gè)數(shù)小于 m,說(shuō)明 m+1~n 這一段一定有重復(fù)數(shù)字,在后一段取中間值比較;
按照上述方法一直取中間值比較,直到只剩一個(gè)數(shù)字且這個(gè)數(shù)字出現(xiàn)次數(shù)超過(guò) 1 ,該數(shù)字即為重復(fù)數(shù)字

# 解決

def find_dux_num(seq):
    if len(seq) <= 1 or seq is None:
        return None

    start, end = 1, len(seq) - 1  # 獲取數(shù)字1,n

    while start <= end:
        mid = (start+end) // 2  # 獲取中間數(shù)字
        count = count_num(seq, start, mid)  # 計(jì)算[start, mid]數(shù)字之間的數(shù)目

        # 當(dāng)只取到一個(gè)數(shù)字時(shí),如果該數(shù)字出現(xiàn)數(shù)目大于1,就是重復(fù)數(shù)字
        if start == end:
            if count > 1:
                return start
            else:
                break

        # 如果count數(shù)目 > 中間數(shù)字到起始數(shù)字之差,一定存在重復(fù)數(shù)字,繼續(xù)在這一段中求中間數(shù)比較
        if count > mid - start + 1:
            end = mid
        # 否則在后一段中求中間數(shù)比較
        else:
            start = mid + 1

    return None


def count_num(seq, start, end):
    count = 0
    for i in seq:
        if start <= i <= end:
            count += 1
    return count


if __name__ == '__main__':
    print(find_dux_num([1, 2, 3, 4, 3]))
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第2章 基本語(yǔ)法 2.1 概述 基本句法和變量 語(yǔ)句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,613評(píng)論 0 13
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 12,525評(píng)論 6 13
  • 我所思念的是家 我在家度過(guò)了多年至成年離家 在外面幾乎沒(méi)有家的溫暖 我也偷偷哭過(guò)幾回 但最后還是走下來(lái)了 我想回家...
    笑面sr閱讀 314評(píng)論 2 3
  • 雪是大自然的杰作?。∧羌儩嵉耐獗硗侣冻隽怂鼉?nèi)心的甜闊;那沒(méi)有任何掩飾的潔白吐露出了它寬廣的胸襟……我愛(ài)雪,那是因?yàn)?..
    眷戀_4d98閱讀 537評(píng)論 0 4

友情鏈接更多精彩內(nèi)容