zoukankan      html  css  js  c++  java
  • 摩尔投票问题

    今天在leetcode 上看见一个题:

    如果数组中多一半的数都是同一个,则称之为主要元素。给定一个整数数组,找到它的主要元素。若没有,返回-1。

    一开始想用map(虽然也不太会)

    其实这个题,有个限定条件"多于一半",所以就会有一种感觉"map用可惜了",一定有更好的算法满足这个条件啊.

    当然这个题还有别的思路:数组计数和排序找中间值(排序后出现次数大于一半的肯定在中间)

    然后看dl题解,发现有个东西叫:摩尔投票.

    所以我们来看一下摩尔投票

    摩尔投票法基于这样一个事实,

    当一个数的重复次数超过数组长度的一半,每次将两个不相同的数删除,最终剩下的就是要找的数。
    大体思路:

    找一个计数器,设基准数,挨个遍历,相同则计数器加一,不同则减一(如果主要元素一定存在的话,计数器小于零就可以重置了)

    但没法满足不存在就返回-1

    好办,用摩尔投票找出那个数,然后遍历数组看看是不是就行.

     1 int majorityElement(vector<int>& nums)
     2     {
     3         //投票算法
     4         int len = nums.size();
     5         if (len == 0) return -1;//边缘数据也要把握好
     6 
     7         int tmp = nums[0], cnt = 1;
     8         for (int i = 1; i < len; i++)
     9         {
    10             if (nums[i] == tmp) cnt++;
    11             else cnt--;
    12 
    13             if (cnt == 0) tmp = nums[i], cnt = 1;
    14         }
    15 
    16         //验证tmp是不是超过一半
    17         cnt = 0;
    18         for (auto n : nums)
    19             if (n == tmp) cnt++;
    20         return cnt > len / 2 ? tmp : -1;
    21     }
  • 相关阅读:
    递归算法转换为非递归算法的技巧
    22. 平面列表
    14. 二分查找
    那点人生小智慧
    9. Fizz Buzz 问题
    8. 旋转字符串
    6. 合并排序数组:
    归并排序
    远方的她
    微服务体系下如何快速构建一个服务
  • 原文地址:https://www.cnblogs.com/zhmlzhml/p/12639432.html
Copyright © 2011-2022 走看看