算法题5:盛最多水的容器

题目描述:

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。

示例 2:
输入:height = [1,1]
输出:1
 提示:
  • n == height.length
  • 2 <= n <= 105
  • 0 <= height[i] <= 104

思路:

这题我开始的思路是两层for循环遍历所有的组合,提交后超时了,时间复杂度不合格,看了解题才搞清楚,可以采用双指针的方式
从左右两边同时往里移动,计算面积,当左侧木板过度小于右侧木板高度时,左侧指针向右移动一次,反之则右侧指针向左右移动
 
在每个状态下,无论左侧或右侧指针向中间收缩一格,都会导致水槽底部宽度 减1 变短,那么两侧模板移动对面积的可能影响:
1、若向内移动短板,水槽的短板可能变大,那么下个水槽的面积可能变大
2、若向内移动长版,水槽的短板不变或变小,那么下个水槽的面积一定变小
因为每次箱内移动短板可能会获得更大的水槽面积,那么思路就是每次移动时取高度短的那个,直到两个指针相遇,获取所有面积组合的最大值即为答案
 

 python:

class Solution:
    def maxArea(self, height: List[int]) -> int:
        # 面积为长度*两条线之间较短的height[i]
        max_value, left_num, right_num = 0, 0, len(height) - 1
       
        while ( left_num < right_num):
            # 面积
            area = (right_num - left_num) * min(height[left_num], height[right_num])
            if area > max_value:
                max_value = area
            if height[left_num] > height[right_num]:
                right_num -= 1
            else:
                left_num += 1
            
        return max_value

        

结果:

 

 

java:

class Solution {
    public int maxArea(int[] height) {
        int left = 0;
        int right = height.length - 1;
        int max_area = 0;
        while (left < right) {
            int area = (right - left) * Math.min(height[left], height[right]);
            max_area = Math.max(area, max_area);
            if (height[left] > height[right]) {
                right --;
            } else {
                left ++;
            }

        }
        return max_area;
        
    }
}

结果 

 

posted @ 2025-04-25 08:59  夏晓旭  阅读(35)  评论(0)    收藏  举报