/**
* @param {number[]} nums
* @return {number}
* 分多钟情况:
* 1. 前缀数组只出现一种数字
* 2. 前缀数组出现多种数字:
* (1) 多种数字其中一种只出现一次, 其它出现次数相同(第2、3个if就是这种情况)
* (2) 多种数字其中一种出现occurMaxNumCount次, 其它出现occurMaxNumCount - 1次
* 所以, 总共有三种情况
*
*
*
*/
var maxEqualFreq = function(nums) {
// 出现最多的数出现的次数
let occurMaxNumCount = 0
// 到目前为止出现了多少种数字
let n = 0
// 统计每个数的出现次数
let occurs = new Array(100001)
// 统计出现次数为i的数有多少种
let countCount = new Array(100001)
let ans = 0
let len = 0
for(let x of nums) {
len++
if(!occurs[x]) {
n++
occurs[x] = 1
} else {
occurs[x]++
}
if(occurs[x] > 1) {
countCount[occurs[x] - 1]--
}
if(occurs[x] > occurMaxNumCount) occurMaxNumCount = occurs[x]
if(!countCount[occurs[x]]) {
countCount[occurs[x]] = 1
} else countCount[occurs[x]]++
// 只出现了一种数字
if(n === 1) {
ans = len
// 出现多种数字,但出现次数全部为1
} else if(countCount[1] === n){
ans = len
// 出现多种数字, 出现次数为1的有一种, 其它n - 1种出现次数为occurMaxNumCount
} else if((countCount[1] === 1) && (countCount[occurMaxNumCount] === (n - 1))){
ans = len
// 出现了多种数字, 出现次数最多的只有一种, 出现次数为occurMaxNumCount - 1的有n - 1种
} else if((countCount[occurMaxNumCount] === 1) && (countCount[occurMaxNumCount - 1] === (n - 1))) {
ans = len
}
}
return ans
};