思路
- 排除法排除一部分不可能情况
- 1、总 和 为奇数的排除
- 2、数组最大数 大于总和一半的 排除
- 3、假设一个子数组长度为 n , 那么 sum * n % len = 0 ,轮询 没有整除的排除
出自该博文
- 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]
这个怎么可能均分??
我不管
这题算我刷过了。。。