盛最多水的容器

内容目录

11. 盛最多水的容器

problem

题目分析

刚开始接触到这个题目的时候可能会想着只要将所有情况遍历一遍,先是 i 为左桶沿的所有情况,然后 i+1 ,i+2… 但是这种做法显然不是最优解。不如我们换一种遍历的想法

刚才我们是想要将所有值都作为桶的一边遍历一遍。要是我们遍历桶底长度呢。

桶底的长度最大值为数组的长度,也就是将数组两端的值作为桶的两边,这样从最大遍历到最小时间复杂度为 O(n),每次将桶底长度减一,也就是将数组的两端向中间移动一位。选择移动哪一边呢? 显然是选择较短的那一边

这种方法是典型的双指针法

逐步实现:
首先我们需要两个指针指向数组的两端:

/**
 * @param {number[]} height
 * @return {number}
 */
var maxArea = function (height) {
  let r = height.length - 1; // 右指针
  let l = 0; // 左指针
};

然后开始遍历数组,每次遍历都将桶底长度减一,并且判断当前的面积是否大于之前的最大面积:

/**
 * @param {number[]} height
 * @return {number}
 */
var maxArea = function (height) {
  let r = height.length - 1; // 右指针
  let l = 0; // 左指针
  let max = 0; // 最大面积

  for (let i = 0; i < height.length; i++) {
    // 遍历数组
    let a = Math.min(height[l], height[r]); //最小桶边
    let s = a * (r - l); // 面积
    height[l] > height[r] ? r-- : l++; // 移动指针
    max = Math.max(max, s); // 更新最大面积
  }
  return max;
};

总结

这一题无论是题目的难度,还是最终代码实现的难度,都不高。但是前提是能够想到双指针法的方法,这是一种常见且高效的解题思路。

相关笔记

最短的桥

934. 最短的桥 题目分析 下面是一个水域 左上角有一个岛 右下角有一个岛 找到两岛间的桥 0 1 0 0 1 1 0 0 0 0 0 1 0 0 1 1 大致想法:我们不需要将两个岛全部都找到,只需要找到第一个岛,然后从这个岛开始扩张,每次向外扩张一圈,直到找到第二个岛,那么我们的扩张次数就是这两个岛间的最短的桥了

阅读全文

Z 字形变换

6.Z 字形变换 题目分析 题目起初看起来可能有些难以理解,所谓的 z 字形变换是一个倒过来的 Z ,看起来是这样的:|/|/|/|。

阅读全文

双指针法

双指针法 双指针法是一种常见的技巧,它的思想是使用两个指针分别指向数组的头部和尾部,然后向中间移动,直到两个指针相遇。 指针移动的条件根据具体的需求而定。 双指针法可以用于解决一些常见的问题,如:查找数组中是否存在某个元素、查找数组中两个数的和等于某个值、查找数组中最长的连续子数组等。 双指针法的时间复杂度通常为 O(n),其中 n 是数组的长度。 题目 盛最多水的容器

阅读全文