91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

劍指offer:數組中出現次數超過一半的數字

發布時間:2020-08-04 07:59:04 來源:網絡 閱讀:338 作者:Jayce_SYSU 欄目:編程語言

題目描述
數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度為9的數組{1,2,3,2,2,2,5,4,2}。由于數字2在數組中出現了5次,超過數組長度的一半,因此輸出2。如果不存在則輸出0。

# -*- 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:
    要尋找一個數組中出現次數大于一半的元素,那么很明顯如果在一個有序數組中,這個元素會出現在數組中
    間,也就是統計意義上的中位數。那么通過尋找位于有序數組的中間的那個元素就可以確定這個中位數。

    解法2:
    如果一個元素出現次數大于一半,那么這個元素的出現次數一定大于其他所有元素的出現次數之和。
    因此,如果我們對上一次出現的元素進行統計,最后剩下的那個元素就是我們的目標元素。
    具體來說,如果當前出現的元素和之前保存的元素不一樣,那么次數-1,反之+1.如果次數減到0了,那么
    保存當前新出現的元素。
    """
    def MoreThanHalfNum_Solution2(self, numbers):
        def partition(begin, stop):
            # 這個函數的作用就是確定一個元素在有序數組中的正確位置,可以用來尋找位于有序數組正中
            # 間的元素
            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:
            # 如果排好序的那個元素不在正中間,那么就根據它的位置重新確定待排序的子數組
            if index > mid:
                end = index - 1
            else:
                start = index + 1

            index = partition(start, end)

        # 注意要檢查找到的目標元素是否符合要求
        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)):
            # 如果當前元素和保存的元素一致,那么count+1,反之-1.
            if numbers[i] == ans:
                count += 1
            else:
                count -= 1
            # 如果count減到0,那么用當前元素替換之前保存的元素
            if count <= 0:
                ans = numbers[i]

        # 注意要檢查找到的目標元素是否符合要求
        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()
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

磐安县| 阿坝县| 自贡市| 五常市| 明溪县| 独山县| 伊宁市| 淮南市| 南涧| 宜章县| 潞西市| 和田县| 乌鲁木齐市| 连云港市| 察隅县| 武胜县| 新津县| 大悟县| 秦皇岛市| 突泉县| 罗甸县| 化州市| 桦南县| 和硕县| 宣城市| 石阡县| 太仆寺旗| 湄潭县| 靖远县| 观塘区| 五原县| 淅川县| 广汉市| 巴南区| 城固县| 邯郸县| 土默特右旗| 思茅市| 桑植县| 聊城市| 平阳县|