一、题目
给定一个大小为 n
的数组 nums
,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋
的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入:nums = [3,2,3] 输出:3
示例 2:
输入:nums = [2,2,1,1,1,2,2] 输出:2
提示:
n == nums.length
1 <= n <= 5 * 104
-109 <= nums[i] <= 109
二、思路解析
这道题,本来有很简单的写法,但我看到一条热评,点过去跳到一个视频。是一位博主,讲的特别有意思,我忍不住听完了,下面分享他的解题思路:
首先,博主非常细节地说,虽然题目跟我们说,可以假设数组非空,并且总是存在元素。但我们要保持好习惯,判断好数组是否是为空,以及长度是否为零。(这点对我来说,是很值得学习的一点!)
其次,他的想法就是,把元素看成一个个小兵,不同的可以看成互相打架,抵消掉;而相同的小兵则可以让 count ++;后面再遇到不同元素,则 count --。
怎么样,是不是非常有意思?
不过需要注意的是,要分三种情况讨论:
一是 nums [ i ] == winner 的,这个时候我们直接让 count ++ 即可;
二是 count == 0 的,也就是小兵都抵消完了。这时候就需要我们手动去给 winner 赋值,直接赋值为 nums [ i ] 即可,再让 count ++;
上面两种情况判断完了之后,就剩最后一种普通情况,也就是碰到不同元素,小兵之间要互相掐架,所以 count --;
到这就写完了,最后返回 winner 即可,毕竟或者的那位 “ winner ”,才是数量最多的元素嘛!
三、完整代码
class Solution {
public int majorityElement(int[] nums) {
if(nums==null||nums.length==0){
return Integer.MIN_VALUE;
}
int winner = nums [0];
int count = 1;
for (int i = 1 ; i < nums.length ; i ++){
if(nums[i]==winner){
count++;
}else if(count == 0) {
winner = nums [i];
count++;
}else{
count--;
}
}
return winner;
}
}
以上就是本篇博客的全部内容啦,如有不足之处,还请各位指出,期待能和各位一起进步!