題目描述
數(shù)組中有一個數(shù)字出現(xiàn)的次數(shù)超過數(shù)組長度的一半,請找出這個數(shù)字。例如輸入一個長度為9的數(shù)組{1,2,3,2,2,2,5,4,2}。由于數(shù)字2在數(shù)組中出現(xiàn)了5次,超過數(shù)組長度的一半,因此輸出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:
要尋找一個數(shù)組中出現(xiàn)次數(shù)大于一半的元素,那么很明顯如果在一個有序數(shù)組中,這個元素會出現(xiàn)在數(shù)組中
間,也就是統(tǒng)計意義上的中位數(shù)。那么通過尋找位于有序數(shù)組的中間的那個元素就可以確定這個中位數(shù)。
解法2:
如果一個元素出現(xiàn)次數(shù)大于一半,那么這個元素的出現(xiàn)次數(shù)一定大于其他所有元素的出現(xiàn)次數(shù)之和。
因此,如果我們對上一次出現(xiàn)的元素進行統(tǒng)計,最后剩下的那個元素就是我們的目標元素。
具體來說,如果當前出現(xiàn)的元素和之前保存的元素不一樣,那么次數(shù)-1,反之+1.如果次數(shù)減到0了,那么
保存當前新出現(xiàn)的元素。
"""
def MoreThanHalfNum_Solution2(self, numbers):
def partition(begin, stop):
# 這個函數(shù)的作用就是確定一個元素在有序數(shù)組中的正確位置,可以用來尋找位于有序數(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:
# 如果排好序的那個元素不在正中間,那么就根據(jù)它的位置重新確定待排序的子數(shù)組
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()
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
網(wǎng)頁標題:劍指offer:數(shù)組中出現(xiàn)次數(shù)超過一半的數(shù)字-創(chuàng)新互聯(lián)
文章地址:http://m.rwnh.cn/article48/djhghp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、軟件開發(fā)、電子商務(wù)、ChatGPT、小程序開發(fā)、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)