lotus

贵有恒何必三更眠五更起 最无益只怕一日曝十日寒

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  1846 随笔 :: 0 文章 :: 109 评论 :: 288万 阅读

1. 题目

 

 https://leetcode.cn/problems/container-with-most-water/description/

 

 

 

2. 解法

思路

使用双指针法,

  1. 从数组的两端向中间移动,每次计算当前的容积,并更新最大值,
  2. 然后移动较矮的一端,直到两个指针相遇。

 

为什么要移动较矮的一端吗?

这是因为容积的大小取决于两个指针之间的距离和较矮的一端的高度。

如果移动较高的一端,那么容积只会变小或者不变,因为距离减少了,而高度还是受限于较矮的一端。

但是如果移动较矮的一端,那么有可能遇到更高的一端,从而增加容积。所以为了找到最大的容积,我们应该移动较矮的一端。

 

 

代码逻辑

  • 首先,我们用两个指针分别指向数组的左右两端,这样就表示了最宽的容器。
  • 然后,我们计算这个容器的容量,它等于两个指针指向的高度中较小的那个乘以指针之间的距离。
  • 接着,我们更新最大容量,如果当前容量大于最大容量,就把最大容量设为当前容量。
  • 然后,我们要移动一个指针,以期望找到更大的容量。我们应该移动哪个指针呢?我们应该移动高度较小的那个指针,因为如果移动高度较大的那个指针,容量只会变小或不变,而不会变大。所以我们比较两个指针指向的高度,如果左边的小于右边的,就移动左指针,否则移动右指针。
  • 最后,我们重复上述步骤,直到左右指针相遇,这时候就找到了最大容量。

 

具体实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static int maxArea(int[] height) {
    int maxArea = 0;
 
    for (int i = 0, j = height.length - 1; i < j; ) {
 
        int current = Math.min(height[i], height[j]) * (j - i);
        maxArea = Math.max(maxArea, current);
 
        if (height[i] < height[j]) {
            i++;
        } else {
            j--;
        }
    }
    return maxArea;
}

  

3. 总结

posted on   白露~  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示