题目
给定一个全是0和1的数组,翻转某个区间,使得最后1的数量最多,返回1的数量
- 区间要反转1最多,就是要找某个区间0的数量减1的数量最多,将0变成1,将1变成-1,也就转换成了求数组的最大累加和,假设累加和为2,表明某个区间的0被1抵消掉了还多了2,所以实际上的1为初始未转换前的1的数量+最大累加和
- 本题的核心思想为:求某个区间数量最多的可以转换成累加和
function process(arr) {
let preNum = 0;
for (let i = 0; i < arr.length; i++) {
preNum += arr[i];
}
for (let i = 0; i < arr.length; i++) {
arr[i] === 0 ? 1 : -1;
}
return preNum + maxSubArray(arr);
}
function maxSubArray(arr) {
let max = -Infinity,
cur = 0;
for (let i = 0; i < arr.length; i++) {
cur += arr[i];
max = Math.max(max, cur);
cur = cur < 0 ? 0 : cur;
}
return max;
}