[Wrong Answer] Leetcode 805 JavaScript 解决方案 数组的均值分割

249 阅读1分钟

思路

  • 排除法排除一部分不可能情况
    • 1、总 和 为奇数的排除
    • 2、数组最大数 大于总和一半的 排除
    • 3、假设一个子数组长度为 n , 那么 sum * n % len = 0 ,轮询 没有整除的排除
      出自该博文
\frac{Sum}{len} = \frac{Asum}{n} = \frac{Sum - Asum}{len - n}
  • 1-0 背包方法绘制二维图表

代码

/**
 * @param {number[]} A
 * @return {boolean}
 */
var splitArraySameAverage = function(A) {
    A.sort((a, b) => a - b); 
    function getSum(list){
        return list.reduce((sum, ele) => sum + ele, 0)
    }
    let sum = getSum(A);
    if(sum % 2 !== 0){
        return false;
    }
    let len = A.length;
    let sumHalf = sum / 2;
    if(A[len - 1] > sumHalf){ // 最大数大于一半 肯定分不匀
        return false;
    }
    let flag = false;
    for(let i = 1; i < len; ++i){
        if(sum * i % len === 0){
            flag = true;
            break;
        }
    }
    if(!flag){
        return false;
    }
    let matrix = [];
    for(let i = 0; i < len; ++i){ // 创建背包二维数组
        matrix.push([]);
    }
    for(let i = 0; i < len; ++i){
        for(let j = 0; j <= sumHalf; ++j){
            if(i === 0 || j === 0){
                matrix[i][j] = 0;
                continue;
            }
            if(j >= A[i - 1]){
                matrix[i][j] = Math.max(matrix[i - 1][j],
                                   matrix[i - 1][j - A[i - 1]] + A[i - 1]);
            }
            else{
                matrix[i][j] = matrix[i - 1][j];
            }
            if(matrix[i][j] === sumHalf){
                console.log(matrix);
                return true;
            }
        }
    }
    console.log(matrix);
    return false;
};

Bazinga

代码没有通过,对不对?😂😂😂
我也觉得很神奇啊,这种情况应该给 false 啊,机器判定 true 。。。

结论

刷题还学了 背包问题 很充实了

[5,3,11,19,2]

这个怎么可能均分??
我不管 这题算我刷过了。。。