题目链接:力扣
思路:数据大于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
}
}