1 问题
给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
数据范围:n≤50000,数组中元素的值 0≤val≤10000
要求:空间复杂度:O(1),时间复杂度 O(n)
示例1
输入:[1,2,3,2,2,2,5,4,2]
返回值:2
示例2
输入:[3,3,3,3,2,2,2]
返回值:3
示例3
输入:[1]
返回值:1
2 答案
这题直接不会,要求空间复杂度:O(1),没有思路
官方解,摩尔投票算法
指通过线性的时间和固定的空间来找到一组序列中众数是哪一个的一种算法。
- 首先创建一个初始指针,从序列一开始位置扫描;同时这个指针扫描的对象包含: a current candidate(一个当前的候选人)和a counter(当前候选人的票数)。当然一开始这个候选人是未知的;票数也就是0。
- 接着移动指针经过每个元素:
- 如果一开始的票数为0,那么就把当前元素作为candidate,并且票数变为1;
- 如果票数不为0,那么就根据该元素是否与candidate相同,相同则票数+1;否则票数减1。 当票数减为0 后,又开始寻找新的candidate并统计票数,重复前面的步骤。
- 直到指针走完整个序列,如果序列存在众数,那么当前的candidate就是我们要找的众数。
class Solution:
def MoreThanHalfNum_Solution(self , numbers: List[int]) -> int:
counts = 0
condidate = 0
for i in numbers:
if counts == 0:
condidate = i
if condidate == i:
counts += 1
else:
counts -= 1
return condidate
https://www.nowcoder.com/share/jump/9318638301698889697619