LeetCode - 169. Majority Element

来源:互联网 发布:网络机顶盒排行榜 编辑:程序博客网 时间:2024/06/15 04:02

这道题的目的是找到数组中出现次数大于一半的数字,一开始的想法是使用一个HashMap记录各个数字出现的次数,然后从中找到出现次数大于nums.length / 2的数字,这种方法比较直接,但是使用了O(n)的额外空间,算不上是最好的方法。

LeetCode的discuss版里有人提出了一个更好的解法,我们首先把majority element设置为数组的第一个数字,并且把数字出现的次数设置为count = 1,然后从第二个数字开始向后扫描,如果遇到的数字与majority element相等,那么count++,否则count--,如果count == 0,那么把majority element设置为当前的元素并且把count设置为1。这个算法的总体思想就是使用出现次数大于nums.length / 2的元素去抵消其他的元素,那么最后留下的一定是出现次数大于nums.length / 2的元素。代码如下:

public class Solution {    public int majorityElement(int[] nums) {        if(nums == null || nums.length == 0) return 0;                int majorElem = nums[0];        int count = 1;                for(int i = 1; i < nums.length; i++){            if(nums[i] == majorElem) count++;            else if(nums[i] != majorElem) count--;                        if(count == 0){                majorElem = nums[i];                count++;            }        }                return majorElem;    }}


0 0
原创粉丝点击