229. 多数元素 II
Posted 心脏dance
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了229. 多数元素 II相关的知识,希望对你有一定的参考价值。
题目链接:力扣
思路:数据大于floor(n/3)向下取整的数最多只有两个(仔细想想),或者1个,或者没有。这样的话就采取类似最近很火的游戏“羊了个羊”消除,当然区别就是我们槽位只有2个,点击第三个的时候只有不一样这三个才会同时消除,如果相同就叠在对应的槽位上,这样最后剩下的两个槽位上面的值才有可能大于floor(n/3),为什么说有可能,因为存在一种特殊情况:【3,2,3】,这种情况下通过我们的算法最后会出现,第一个槽位剩下3,第二个槽位剩下2,但是只有3是满足的,所以最后我们再把这两个值验证一下即可。别的能消除的一定不会大于floor(n/3),因为消除的是三个不一样的数。
两次for循环,所以时间复杂度为O(n)。
空间上面我们只开了几个变量,所以时间复杂度O(1)。
上代码:
class Solution
fun majorityElement(nums: IntArray): List<Int>
val count = nums.size / 3
var numOne: Int? = null
var numTwo: Int? = null
var numOneCount = 0
var numTwoCount = 0
nums.forEach x ->
when (x)
numOne -> numOneCount++
numTwo -> numTwoCount++
else ->
when (null)
numOne ->
numOne = x
numOneCount++
numTwo ->
numTwo = x
numTwoCount++
else ->
numOneCount--
if (numOneCount == 0) numOne = null
numTwoCount--
if (numTwoCount == 0) numTwo = null
numOneCount = 0
numTwoCount = 0
nums.forEach x ->
when
numOne != null && x == numOne -> numOneCount++
numTwo != null && x == numTwo -> numTwoCount++
val list = mutableListOf<Int>()
if (numOneCount > count) numOne?.let list.add(it)
if (numTwoCount > count) numTwo?.let list.add(it)
return list
以上是关于229. 多数元素 II的主要内容,如果未能解决你的问题,请参考以下文章
[LeetCode] 229. Majority Element II 多数元素 II
leetcode-Majority Element II-229
LeetCode 229 Majority Element II(主要元素II)(Array)(Boyer–Moore majority vote algorithm)