每日一道算法 Day1

87 阅读1分钟

题目描述如下:

截屏2021-07-27 下午10.33.04.png

思路1:

暴力破解, 两重for循环:

function maxArea(nums: number[]): number {
  if (nums.length < 1) return 0;
  let res = 0;
  for (let i = 0; i < nums.length; ++i) {
    for (let j = i + 1; j < nums.length; ++j) {
      const tmp = Math.min(nums[i], nums[j]) * (j - i);
      res = Math.max(tmp, res)
    }
  }
  return res;
}

然后:

截屏2021-07-27 下午10.41.28.png

换个思路, 双指针移动。

function maxArea(nums: number[]): number {
  if (nums.length < 1) return 0;
  let res = 0;

  /**
   * 双指针
   * 根据上面的 代码得出 伪代码 为:
   * res = max(res, min(nums[i], nums[j]) * (j - i));
   * 现在思路为 双指针该移动哪一根?
   * 转化为数学题:
   * 当移动 当前值较大的指针 较移动 当前值较小的指针 面积变小了 (核心)
   * 所以每次移动 值较小的指针
   */
  let i = 0;
  let j = nums.length - 1;

  while (i < j) {
    let tmp = Math.min(nums[i], nums[j]) * (j - i);
    res = Math.max(tmp, res);
    if (nums[i] > nums[j]) j--;
    else i++;
  }
  return res;
}

截屏2021-07-27 下午10.45.02.png

截屏2021-07-27 下午10.45.07.png

截屏2021-07-27 下午11.00.12.png

ok, 单元测试通过。