『力扣每日一题17』:多数元素

一、题目

给定一个大小为 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;



    }
}

以上就是本篇博客的全部内容啦,如有不足之处,还请各位指出,期待能和各位一起进步!

你可能感兴趣的:(力扣每日一题,leetcode,算法,职场和发展,贪心算法,java,数据结构,intellij-idea)