【劍指Offer】數組中出現次數超過一半的數字 Python版


  • 題目描述

    給定一個數組,如果這個數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字;如果不存在,則返回0。

  • 思路分析

    對於一個數組而言,滿足題目要求的數字最多只有一個,可以采用數字相互抵消的思想。在遍歷數組時,儲存兩個值now和count,now是當前數字,count是該數字的標記。當下一個數字與now相等時,標記count的值加1,如果不相等,則減1;當標記count的值變為0時,則將下一個數字的值用now來存儲,並將count的值置為1,繼續遍歷完數組。

    如果數組中存在出現次數超過數組長度一半的數,那遍歷過后now中存儲的即為這個數字;

    如果數組中不存在滿足要求的數,最后now中也會存儲一個不符合要求數值。

    所以,在算法的最后,要重新遍歷一遍數組,對變量now中的值進行計數並判斷,從而驗證結果。

  • 解法

    根據思路編寫代碼,時間復雜度為O(N)

    

 1 def HalfLengthSolution(self, numbers):
 2         #判斷極端情況
 3         if len(numbers) == 0:
 4             return 0
 5         #初始化記錄變量now和count
 6         count = 1
 7         now = numbers[0]
 8         length = len(numbers)
 9         #遍歷數組,采用抵消的方法,尋找結果
10         for i in range(1,length):
11             if count == 0:
12                 now = numbers[i]
13                 count += 1
14             else:
15                 if numbers[i] == now:
16                     count += 1
17                 else:
18                     count -= 1
19         #驗證now中存儲的值是否符合題目要求
20         test = 0
21         for item in numbers:
22             if item == now:
23                 test += 1
24         if test > length/2:
25             return now
26         else:
27             return 0

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM