11. 盛最多水的容器(leetcode):双指针求解

解题思路:

首先我们定义了一个result,用来实时更新每次计算的最大容积
接下来我们创建了两个指针leftright,这两个指针的初始位置分别为数组的最左端和最右端,我们从这个状态进入循环,计算每一步的容积,循环终止的条件是当左指针和右指针重叠,下面是本题的核心环节:

  1. 首先计算出最左端与最右端之间的间距,作为宽度w,且取这两个指针指向值的较小者作为高度h(木桶存水的高度取决于最短的那个木板)两者之积便是此时的容积。
  2. 将此容积w*hresult的值作比较,如果两者直接大于result,则更新result的值,否做则不做修改(解题中使用三目运算符进行操作)。
  3. 接下来到了关键时刻,两个指针按照怎样的规则移动,才能正确的求解出最大值,而不错过容积最大值呢?还是木桶理论,存水的高低只能取决于最短的那个木板,所以我们需要移移动两侧较小的那个指针,如果左侧小,就执行left--,反之则执行right++
    以上就是这个题目的解法

代码如下

var maxArea = function (height) {
  //创建返回值
  let result = 0;
  //创建两个指针(首尾指针)
  let left = 0;
  let right = height.length - 1;
  //进入循环
  while (left < right) {
    //计算出此时的width
    let w = right - left;
    //计算高度
    let h = height[left] < height[right] ? height[left] : height[right];
    //计算容积
    result = result < w * h ? w * h : result;
    //移动高度较低的指针,向对侧移动
    height[left] < height[right] ? left++ : right--;
  }
  return result;
};

总结

本题采用了双指针解法,通过不断移动左指针和右指针,最终一步一步求解出最大的容积,刚开始无脑暴力枚举,没想到超时啦~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值