zoukankan      html  css  js  c++  java
  • 169. 多数元素

    投票法可解,思路如下:

    假设第一个元素为多数,那么每次遇到相同元素+1,不同元素-1,迭代一遍之后必然有count>0(题目中多数得定义为出现次数大于1/2)

    但是这个时候有一个问题,就是假设第一个元素不是多数,或者虽然是多数,但是在左侧某一段内非多数比如[2,1,1,2,2]在前三个

    元素时2就是-1了,但是我们可以肯定2就是多数。这里需要一点简单的数学推导。

    假设多数有n个,其余元素m个,根据题意必然存在n>m。当迭代至某位置x时count=0,[0,x]中必然有首元素出现次数为x/2,非首

    元素出现次数同样为x/2,可推得n-x/2>m-x/2,翻译一下,就是当count=0时,必然存在右侧即[x,m+n-x]这段中,原数组中得多数元素在

    后续数组中依然成立,这时我们发现可以继续对右侧进行之前的操作,即假定第一个元素为多数,以此类推,参照上面得数组[2,1,1,2,2]

    最终切割得到的右侧数组为[2],可得到正确结论。时间O(n),空间O(1)

    public int majorityElement(int[] nums) {
           int res = nums[0],count=0;
            for (int num:nums){
            // 遇到不同元素-1
    if (num!=res){ count--; }else {
            // 相同元素+1 count
    ++; }
           // 当左侧数组远不抵消,此时需要选择新的候选人
    if (count==0){ res=num; count=1; } } return res; }
    争取早日不再是一只菜鸡
  • 相关阅读:
    移动端H5页面之iphone6的适配(转)
    html5调用手机相机并压缩、上传
    js获取图片的尺寸
    thinkphp3.2使用join联合查询
    快递100接口使用
    php 静态方法和非静态方法的调用说明
    php 小程序获取渠道二维码 保存
    php 下载图片到服务器
    php 修改文件内容,替换指定内容
    composer 安装 laravel 更换下载源
  • 原文地址:https://www.cnblogs.com/jchen104/p/14582268.html
Copyright © 2011-2022 走看看