leetcode 1224 最大相等频率

475 阅读1分钟
/**
 * @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
};