摩尔投票法

落日映苍穹つ 2023-07-02 09:24 160阅读 0赞

背景: leetcode 169题求一个数组中,出现次数大于 n/2;的元素

如果在一个遍历中解决这个问题??
答案就是摩尔投票法。

摩尔投票法:用一个计数器,每次当计数器为0时,以当前遍历元素为起点遍历,当往下遍历时,相同元素计数加1,元素不同计数器减1。那么最后剩下的元素为出现次数大于n/2。

eg: [2222221111];

  1. public int majorityElement(int[] nums) {
  2. int candidate = nums[0], count = 1;
  3. for (int i = 1; i < nums.length; ++i) {
  4. if (count == 0) {
  5. candidate = nums[i];
  6. count = 1;
  7. } else if (nums[i] == candidate) {
  8. count++;
  9. } else{
  10. count--;
  11. }
  12. }
  13. return candidate;
  14. }

leetcode 229 求众数II ,找出当前出现次数大于 n/3.。
思路:在169题中,出现n/2只有一个元素,而在本题次数大于n/3.最多2个。于是拿两个计数去判断即可。(参考评论的^ ^);

  1. class Solution {
  2. public List<Integer> majorityElement(int[] nums) {
  3. List<Integer> res = new ArrayList<>();
  4. int cx = 0,cy = 0;
  5. int x = 0,y = 0;
  6. for (int n: nums)
  7. {
  8. if ((cx == 0 || n == x) && n != y) {
  9. cx++;
  10. x = n;
  11. } else if (cy == 0 || y == n) {
  12. cy++;
  13. y = n;
  14. } else {
  15. cx--;
  16. cy--;
  17. }
  18. }
  19. int count = 0;
  20. for (int n: nums) {
  21. if (x == n) count++;
  22. }
  23. if (count > nums.length/3)
  24. res.add(x);
  25. count = 0;
  26. for (int n: nums) {
  27. if (y == n) count++;
  28. }
  29. if (count > nums.length/3 && x!= y)
  30. res.add(y);
  31. return res;
  32. }
  33. }

发表评论

表情:
评论列表 (有 0 条评论,160人围观)

还没有评论,来说两句吧...

相关阅读

    相关 投票

    背景: leetcode 169题求一个数组中,出现次数大于 n/2;的元素 如果在一个遍历中解决这个问题?? 答案就是摩尔投票法。 摩尔投票法:用一个计数器,每次当计

    相关 投票

    提问: 给定一个int型数组,找出该数组中出现次数大于数组长度一半的int值。 解决方案: 遍历该数组,统计每个int值出现次数,再遍历该数组,找出出现次数大于数组长度一半的

    相关 投票

    摩尔投票 问题背景 在一个大厅中,每位票民手中都有一张票他可以给自己喜欢的候选人偷一票,我们现在已知每个票民的投票结果。 问:如何通过一次遍历找到票数超过一半的

    相关 8-1投票

    > 不同的数字进行一对一“火并”(原理不再赘叙), > 如果存在众数,“火并”之后留下了的一定是,最后还需要进行验证。 先上模板:         ![watermar