- 題目描述
給定一個數組,如果這個數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字;如果不存在,則返回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