前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >算法篇:摩尔投票法的使用

算法篇:摩尔投票法的使用

作者头像
灰子学技术
发布2020-09-23 15:34:12
5850
发布2020-09-23 15:34:12
举报
文章被收录于专栏:灰子学技术灰子学技术

算法:

典型的摩尔投票法使用场景

摩尔投票法分为两个阶段:抵消阶段和计数阶段。

代码语言:javascript
复制
1. 抵消阶段:两个不同投票进行对坑,并且同时抵消掉各一张票,
如果两个投票相同,则累加可抵消的次数;
2. 计数阶段:在抵消阶段最后得到的抵消计数只要不为0,那这个候选人是有可能超过一半的票数的,
 为了验证,则需要遍历一次,统计票数,才可确定。
 备注:对于1/3,1/4.....1/n,做法就是设置n-1个投票候选人,采用摩尔投票的方法进行操作。

题目1: 超过半数的多数元素

https://leetcode-cn.com/problems/majority-element/

代码实现:

代码语言:javascript
复制
func majorityElement(nums []int) int {
    tmp,count := 0,0
    for _,num:=range nums {
        if count == 0 {
            tmp = num
        }
        if num == tmp {
            count++
        } else {
            count--
        }
    }
    return tmp
}
// 算法:数组里面有一个数超过一半数量,
// 那么可以用这个数作为标示,这个数就+1,不是这个数就-1,最后剩余的数就是所求

执行结果:

题目2: 求众数

https://leetcode-cn.com/problems/majority-element-ii/

代码实现:

代码语言:javascript
复制
func majorityElement(nums []int) []int {
  // 创建返回值
  var res = make([]int, 0)
  if nums == nil || len(nums) == 0 {
    return res
  }

  // 初始化两个候选人 candidate,以及他们的计数票
  cand1 := nums[0]
  count1 := 0
  cand2 := nums[0]
  count2 := 0

  //摩尔投票法
  // 配对阶段
  for _, num := range nums {
    // 投票
    if cand1 == num {
      count1++
      continue
    }
    if cand2 == num {
      count2++
      continue
    }

    if count1 == 0 {
      cand1 = num
      count1++
      continue
    }
    if count2 == 0 {
      cand2 = num
      count2++
            continue
    }

    count1--
    count2--
  }
  // 计数阶段
  count1 = 0
  count2 = 0
  for _, num := range nums {
    if cand1 == num {
      count1++
    } else if cand2 == num {
      count2++
    }
  }

  if count1 > len(nums)/3 {
    res = append(res, cand1)
  }
  if count2 > len(nums)/3 {
    res = append(res, cand2)
  }
  return res
}
// 算法:摩尔投票法的应用
// 因为是1/3,所以采用2个候选人来进行抉择。

执行结果:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-09-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 灰子学技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档