累加和 翻转01区间后最多的1数量

145 阅读1分钟

题目

给定一个全是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;
}