11 盛最多水的容器(2021-07-06)

本文介绍了如何使用双指针算法解决LeetCode中的11号问题——盛最多水的容器。首先,解释了暴力求解方法导致的时间复杂度过高,然后详细解析了双指针法的思路,通过不断移动数字较小的指针来优化搜索过程,减少了时间复杂度到O(N)。最后,给出了两种解法的执行效率对比,并提供了JavaScript代码实现。
摘要由CSDN通过智能技术生成

11. 盛最多水的容器

链接:https://leetcode-cn.com/problems/container-with-most-water/

题目描述见链接内容。

解法1:暴力法

二话不说,暴力开干。分别以每两个坐标作为起始点,画出矩形,比较大小:

var maxArea = function (height) {
  const len = height.length;
  let result = 0;

  for (let i = 0; i < len; i++) {
    for (let j = i + 1; j < len; j++) {
      result = Math.max((j - i) * Math.min(height[i], height[j]), result);
    }
  }

  return result;
};
  • 时间复杂度: O ( N 2 ) {O(N^2)} O(N2)
  • 空间复杂度: O ( 1 ) {O(1)} O(1)
  • 执行用时:果不其然,超时了

解法2:双指针

看完题解之后,发现自己没有过多的自己纠缠是正确的,因为凭自己的智商,根本想不到使用双指针的。看完题解后,说真的,难吗?代码写的很轻松就通过了,但是就是想不到

如果智商够,那么没问题了,如果智商不够,那么只能多做题做扩展思路,在遇到类似的问题,武器库里能多一种使用双指针不断缩小问题规模的武器

声明两个指针,一个在开始位置,一个在结束位置,可以计算出当前可以盛水的容量,然后判断开始位置和结束位置哪个比较小,如果开始位置较小,那么开始指针向后移动,如果结束位置较小,那么结束指针向前移动

也就是说,总是移动数字较小的那个指针,为什么呢?直观的理解,首先无论移动哪个指针,两个指针的间距一定是变小了的,如果移动较大的指针,最终的结果一定小于之前的容积(因为计算容积是的Y轴的值取的是较小者),所以也就意味着这时候较小的指针的位置就被放弃了,因为无论如何都不会再变大了,所以需要移动它

数学证明也不难,可以参考官方题解的证明

代码实现:

var maxArea = function (height) {
  let start = 0,
    end = height.length - 1,
    result = 0;
  while (start < end) {
    result = Math.max(result, Math.min(height[start], height[end]) * (end - start));
    // 移动较小的指针
    if (height[start] < height[end]) {
      start += 1;
    } else {
      end -= 1;
    }
  }
  return result;
};
  • 时间复杂度: O ( N ) {O(N)} O(N)
  • 空间复杂度: O ( 1 ) {O(1)} O(1)
  • 执行用时:100ms, 在所有JavaScript提交中击败了74.69%的用户,内存消耗:46.9MB,在所有JavaScript提交中击败了60.91%的用户
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值