zoukankan      html  css  js  c++  java
  • 169. Majority Element

    问题

    Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.

    You may assume that the array is non-empty and the majority element always exist in the array.

    翻译

    给定大小为n的数组,找到主元素,即出现次数多于n/2向下取整。假设数组非空且存在主元素。

    算法出处http://www.cs.utexas.edu/~moore/best-ideas/mjrty/

    代码:

    详细内容可以读一下作者的论文,这里我简单说下自己的理解

    最近在听《明朝那些事儿》,元末明初农民起义的部分,所以以攻占城池作为例子。注意这里有个重要前提是主元素出现次数多于n/2向下取整。假设相同数字对应的是同一伙人,不同数字对应不同势力,大家都想攻占城池,如下:

    public class Solution {
        public int majorityElement(int[] num) {
            int major=num[0], count = 1;//最先到的先占领城池,也就是数组中第一个元素
            for(int i=1; i<num.length;i++){//数组中的人依次到来,对每个新来的做如下处理
                if(count==0){//count==0,说明之前不同势力的人同归于尽了
                    count++;//count++,也就是count=1,即之前的人同归于尽了,那么这个新来的就占领了城池,且己方力量为1(目前只有他自己)
                    major=num[i];//新来的占领城池,也就是major
                }else if(major==num[i]){//count不为0,有之前的残余势力,那么需要判断,这个势力是不是自己人,是自己人的话
                    count++;//己方力量加一
                }else count--;//不是自己人,自己需要拿出一个人和新来的同归于尽,己方力量减一
                
            }
            return major;
        }
    }
    经过上述计算,由于主元素出现次数多于n/2向下取整,也就是说,即使其它所有势力加起来和主势力作对,也打不过,主势力最少也会剩一个。因此,最后占据城池的一定是主势力。也就是返回的major。

    贴一下我自己的代码,比起上述算法,我的算法复杂性为nlogn,有个排序过程

    import java.util.Arrays;
    class Solution {
    public int majorityElement(int[] nums) {
    Arrays.sort(nums);

    int majority = nums[0];
    int nowNum = 1;
    int majNum = 0;

    for (int i = 1; i < nums.length; i++) {
    if (nums[i] == nums[i - 1]) {
    nowNum++;
    if (nowNum > majNum) {
    majority = nums[i];
    majNum = nowNum;
    }
    }
    else
    nowNum=1;

    }
    return majority;
    }
    }

  • 相关阅读:
    第2课 C 到 C++ 的升级
    第1课 学习 C++ 的意义
    归并排序
    插入排序与希尔排序
    选择排序
    冒泡排序
    CodeSignal 刷题 —— almostIncreasingSequence
    CodeSignal 刷题 —— matrixElementSum
    Python3 序列解包
    单星号变量(*)和双星号变量(**)的用法
  • 原文地址:https://www.cnblogs.com/mafang/p/8448692.html
Copyright © 2011-2022 走看看