525. 连续数组

  • 日期:2021/6/3
  • 难度:中等
  • 思路:给一个只有0和1的数组,找拥有相同个的0和1的最长数组。设置一个状态变量now,遍历数组,遇到0就-1,遇到1则+1,状态相同时,中间含有0和1的个数相同。用map记住now在不同数字下最前面的下标,用当前下标减去最前下标,不断更新res。
function findMaxLength(nums: number[]): number {
  let now = 0, res = 0;
  let mapp = new Map();
  mapp.set(0,-1);
  for(let i=0;i< nums.length; i++) {
    if(nums[i]) {
      now++;
    } else {
      now--;
    }
    if(mapp.has(now)) {
      res = Math.max(res, i - mapp.get(now));
    } else {
      mapp.set(now, i);
    }
  }
  return res;
};

1049. 最后一块石头的重量 II

  • 日期:2021/6/8
  • 难度:中等
  • 思路:给出n个数,数字之间可以消除。如果x == y,则不剩下;如果x > y,则剩下x-y,问最后剩下数字最小为多少。设数字总和为total,avg = toal / 2,把数字分两组,每组的总和尽可能可靠近avg。需要对数字进行总和不超过avg筛选,转化为value = weight的背包问题。
/**
 * @param {number[]} stones
 * @return {number}
 */
var lastStoneWeightII = function(stones) {
  const n = stones.length
  let total = 0
  for (let i = 0; i < n; i++) {
    total += stones[i]
  }
  const avg = total >> 1
  let dp = new Array(avg + 1).fill(0)
  for (let i = 0; i < n; i++) {
    for (let j = avg; j >= stones[i]; j--) {
      dp[j] = Math.max(dp[j], dp[j - stones[i]] + stones[i])
    }
  }
  return(total - 2 * dp[avg])
};

Q.E.D.


我还有很多想要完成的梦想。