所求数出现次数超过一半,占绝对数量优势。
无论被多少其它数消除过,所求数剩下的数量还是超过一半的。
把其它数都耗死,剩下所求数遗世独立。
# 关键条件:数出现次数超过数组长度的一半,即大于其他所有数出现次数之和。 # 遍历时,我们选定第一个数作为候选,并记该数出现一次,在访问之后元素时, # 遇到相等,计数加一(添加),不等,计数减一(消除)。如果计数减到0,则换候选。 # 遍历完成候选就是所求——所求数是超过一半的,哪怕它与其它所有数都做一次比较(消除), # 全局来看count也不会减到0,当然局部可能被其它数完全消除而被赶下候选。 # 但是所求数超过一半,谁也耗不过它,所以胜利终究是所求数的 # class Solution: def MoreThanHalfNum_Solution(self , numbers: List[int]) -> int: count = 0 for num in numbers: if not count: # count减到0, 换候选 candidate = num count += 1 else: if num == candidate: # 遇到相等,计数加一 count += 1 else: count -= 1 # 遇到不等,计数减一 return candidate