劍指offer:數(shù)組中出現(xiàn)次數(shù)超過(guò)一半的數(shù)字-創(chuàng)新互聯(lián)

題目描述
數(shù)組中有一個(gè)數(shù)字出現(xiàn)的次數(shù)超過(guò)數(shù)組長(zhǎng)度的一半,請(qǐng)找出這個(gè)數(shù)字。例如輸入一個(gè)長(zhǎng)度為9的數(shù)組{1,2,3,2,2,2,5,4,2}。由于數(shù)字2在數(shù)組中出現(xiàn)了5次,超過(guò)數(shù)組長(zhǎng)度的一半,因此輸出2。如果不存在則輸出0。

成都創(chuàng)新互聯(lián)公司專注于中大型企業(yè)的網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)和網(wǎng)站改版、網(wǎng)站營(yíng)銷服務(wù),追求商業(yè)策劃與數(shù)據(jù)分析、創(chuàng)意藝術(shù)與技術(shù)開(kāi)發(fā)的融合,累計(jì)客戶成百上千,服務(wù)滿意度達(dá)97%。幫助廣大客戶順利對(duì)接上互聯(lián)網(wǎng)浪潮,準(zhǔn)確優(yōu)選出符合自己需要的互聯(lián)網(wǎng)運(yùn)用,我們將一直專注成都品牌網(wǎng)站建設(shè)和互聯(lián)網(wǎng)程序開(kāi)發(fā),在前進(jìn)的路上,與客戶一起成長(zhǎng)!
# -*- coding: utf-8 -*-
# @Time         : 2019-07-08 17:21
# @Author       : Jayce Wong
# @ProjectName  : job
# @FileName     : MoreThanHalfNum.py
# @Blog         : https://blog.51cto.com/jayce1111
# @Github       : https://github.com/SysuJayce

class Solution:
    """
    解法1:
    要尋找一個(gè)數(shù)組中出現(xiàn)次數(shù)大于一半的元素,那么很明顯如果在一個(gè)有序數(shù)組中,這個(gè)元素會(huì)出現(xiàn)在數(shù)組中
    間,也就是統(tǒng)計(jì)意義上的中位數(shù)。那么通過(guò)尋找位于有序數(shù)組的中間的那個(gè)元素就可以確定這個(gè)中位數(shù)。

    解法2:
    如果一個(gè)元素出現(xiàn)次數(shù)大于一半,那么這個(gè)元素的出現(xiàn)次數(shù)一定大于其他所有元素的出現(xiàn)次數(shù)之和。
    因此,如果我們對(duì)上一次出現(xiàn)的元素進(jìn)行統(tǒng)計(jì),最后剩下的那個(gè)元素就是我們的目標(biāo)元素。
    具體來(lái)說(shuō),如果當(dāng)前出現(xiàn)的元素和之前保存的元素不一樣,那么次數(shù)-1,反之+1.如果次數(shù)減到0了,那么
    保存當(dāng)前新出現(xiàn)的元素。
    """
    def MoreThanHalfNum_Solution2(self, numbers):
        def partition(begin, stop):
            # 這個(gè)函數(shù)的作用就是確定一個(gè)元素在有序數(shù)組中的正確位置,可以用來(lái)尋找位于有序數(shù)組正中
            # 間的元素
            pos = begin
            for i in range(begin, stop):
                if numbers[i] < numbers[stop]:
                    numbers[pos], numbers[i] = numbers[i], numbers[pos]
                    pos += 1
            numbers[stop], numbers[pos] = numbers[pos], numbers[stop]
            return pos

        if not numbers:
            return 0

        mid = len(numbers) >> 1
        start, end = 0, len(numbers) - 1
        index = partition(start, end)
        while index != mid:
            # 如果排好序的那個(gè)元素不在正中間,那么就根據(jù)它的位置重新確定待排序的子數(shù)組
            if index > mid:
                end = index - 1
            else:
                start = index + 1

            index = partition(start, end)

        # 注意要檢查找到的目標(biāo)元素是否符合要求
        count = 0
        for num in numbers:
            if num == numbers[index]:
                count += 1

        return numbers[index] if 2 * count > len(numbers) else 0

    def MoreThanHalfNum_Solution(self, numbers):
        if not numbers:
            return 0

        count = 1
        ans = numbers[0]
        for i in range(1, len(numbers)):
            # 如果當(dāng)前元素和保存的元素一致,那么count+1,反之-1.
            if numbers[i] == ans:
                count += 1
            else:
                count -= 1
            # 如果count減到0,那么用當(dāng)前元素替換之前保存的元素
            if count <= 0:
                ans = numbers[i]

        # 注意要檢查找到的目標(biāo)元素是否符合要求
        count = 0
        for num in numbers:
            if num == ans:
                count += 1

        return ans if count * 2 > len(numbers) else 0

def main():
    nums = [1, 2, 3, 2, 2, 2, 5, 4, 2]
    solution = Solution()
    print(solution.MoreThanHalfNum_Solution(nums))

if __name__ == '__main__':
    main()

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

網(wǎng)頁(yè)標(biāo)題:劍指offer:數(shù)組中出現(xiàn)次數(shù)超過(guò)一半的數(shù)字-創(chuàng)新互聯(lián)
文章地址:http://www.muchs.cn/article48/djhghp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、軟件開(kāi)發(fā)、電子商務(wù)ChatGPT、小程序開(kāi)發(fā)網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作