- 题目描述
给定一个数组,如果这个数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字;如果不存在,则返回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
原文地址:https://www.cnblogs.com/AmazingCodeLee/p/9657941.html
时间: 2024-12-29 11:35:56