LeetCode 热题 HOT 100 11. 盛最多水的容器

252 阅读1分钟

题目

题解

暴力破解

  • 两层循环暴力对比
  • 注意循环终止条件
  • 注意面积的求积公式
  • 每次loop比较、更新面积

/**
 * @param {number[]} height
 * @return {number}
 */
var maxArea = function(height) {
  // 1. 边界情况处理
  if (Array.isArray(height)) {
        // 2. 两层循环求出每次的最大面积: 最短的那条边 * 两条线之间距离(长方形或者正方形)
        let max = 0
        for (let i = 0; i < height.length; i++) {
            for (let j = i + 1; j < height.length; j++) {
                max = Math.max(max, Math.min(height[j], height[i])*(j-i)) // 每次对比之前的max与此次循环的面积
            }
        }
        return max
  }
};

// 时间复杂度 O(n^2)
// 空间复杂度 O(1)

双指针

  • 暴力法会进行很多没有必要的重复计算
  • 我们可以采用双指针进行缩排减少搜索空间
  • 此外当我们遇到需要考虑左右两头的问题时候,就可以考虑使用双指针

/**
 * @param {number[]} height
 * @return {number}
 */
var maxArea = function(height) {
    let max = 0
    let l = 0
    let r = height.length - 1
    while (l < r) {
        max = Math.max(max, (r-l)*Math.min(height[r], height[l]))
        // 较小的指针往较大的值移动 减少不必要的计算
        if (height[l] < height[r]) {
            l++
        } else {
            r--
        }
    }
    return max
};

// 时间复杂度 O(n)
// 空间复杂度 O(1)

推荐阅读

ps: 欢迎关注我的公众号 xyz编程日记,不介意帮忙点个👍,点个在看。