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; }
    争取早日不再是一只菜鸡
  • 相关阅读:
    flask 需要下载的包
    flask知识点
    移动端网页实现(用百分比进行定位)
    js中的preventDefault
    网页重构面试笔试题
    J2EE课程设计的购物车代码(水平有限,仅供参考)
    JavaScript实现对象克隆函数clone( )的程序及分析
    WEB技术书籍推荐
    2016 Tianjin University Software Testing (lab2)
    Mac下安装npm 、node、ionic和cordova
  • 原文地址:https://www.cnblogs.com/jchen104/p/14582268.html
Copyright © 2011-2022 走看看