时间复杂度:O(n),空间复杂度:O(1)
解题思路
思路其实非常简单,我将其称之为“人海战术”。
既然是多数元素,那么它的数量就已经超过了数组总数量的一半,那么如果假设一个元素是一个军团,元素的数量就是军团的人数,一个人只能和一个敌人同归于尽,那么多数元素的军团最后一定会剩下至少一人。按照这个思路,我们就可以记录下当前数量最多的元素和其数量,从头遍历数组,如果遍历的元素不同于当前数量最多的元素,那么就令当前数量最多的元素数量减一(也就是上文提到的同归于尽),当数量为0时就选择当前正在遍历的元素为数量最多的元素。当遍历完数组后,记录的数量最多的元素就是结果。
AC代码
func majorityElement(nums []int) int {
num,count:=nums[0],1
for i:=1;i<len(nums);i++{
if count==0{
num=nums[i]
}
if nums[i]==num{
count++
}else{
count--
}
}
return num
}
感悟
一开始想到位运算去了,咋想没想通。看了眼题目标签,确实和位运算无关,又想了两分钟,突然想到了这个计数的方法,竟然一次就AC……