leetcode-柱状图中最大的矩形,盛水最多的容器,接雨水

这篇博客主要探讨了LeetCode上的三道经典问题——84. 柱状图中最大的矩形、11. 盛最多水的容器以及42. 接雨水。这些问题都涉及到通过动态规划策略来寻找最大面积或积水。解题关键在于确定以当前元素为中心,如何有效地计算出所能形成的矩形面积或可盛水量,以及如何快速找到左右两侧的最大高度。这些算法具有较高的实用价值,能锻炼和提升解决实际问题的能力。

leetcode 84、柱状图中最大的矩形

题目描述:

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

思想:以当前的柱子为中心,向两边扩展,找出界限,计算以当前柱子为中心的矩形面积。

class Solution {
    public int largestRectangleArea(int[] heights) {
        //三指针法,left,curr,right
        int left=0;
        int right=0;
        int curr=0;  //表示当前柱子的索引下标
        int len = heights.length-1;
        int maxArea = 0;
        for(curr=0;curr<=len;curr++){
            //这一步可以减少时间复杂度
            if(heights[curr]*(len+1)<=maxArea) continue;

            //当前柱子在里面找最大

            //找出左边界 left
            for(left=curr-1;left>=0;left--){
                if(heights[left]<heights[curr]){
                    break;
                }
            }
            //找出右边界right
            for(right=curr+1;right<=len;right++){
                if(heights[right]<heights[curr]){
                    break;
                }
            }
            maxArea=Math.max(maxArea,heights[curr]*(right-left-1)); 
        }
        return maxArea;
    }
}

leetcode 11、盛最多水的容器

题目描述:

给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器。

 和上面那题思路差不多

class Solution {
    public int maxArea(int[] height) {
		int left=0;
        int right=0;
        int curr=0;
        int len = height.length-1;
        int maxArea = 0;
        int leftindex = 0;
        int rightindex = 0;
        for(curr=0;curr<=len;curr++){
            //加入这一句时间复杂度大大减少
            if(height[curr]*(len+1)<=maxArea) continue;
            //当前柱子在里面找最大
            for(left=curr;left>=0;left--){
            	//一直往左边找比当前垂直线高的
                if(height[left]>=height[curr]){
                	//记录下最左边比当前垂直线高的索引位置
                	leftindex=left;
                }
            }
            for(right=curr;right<=len;right++){
            	//一直往右边找比当前垂直线高的
                if(height[right]>=height[curr]){
                	rightindex = right;
                }
            }

            maxArea=Math.max(maxArea,height[curr]*(rightindex-leftindex));
            leftindex=0;
            rightindex=0;
        }
   
        return maxArea;
    }
}

 leetcode 42、接雨水

题目描述:

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

直观的想法,对于数组中的每个元素(柱子),下雨后水能积水的面积等于当前柱子两边最大高度的较小值减去当前高度

所以重点是如何快速找到当前柱子两边的最大高度,当然可以用暴力法,但是暴力法的时间复杂度要到O(n^2),可以先找出每个柱子的左边最大高度以及右边的最大高度.

class Solution {
    public int trap(int[] height) {
        int len = height.length-1;
        int[] left = new int[len+1];
        int[] right = new int[len+1];
        //找出当前柱子左边的最大高度
        for(int i=1;i<=len;i++){
            left[i]=Math.max(left[i-1],height[i-1]);
        }
        //找出当前柱子右边的最大高度
        for(int i=len-1;i>=0;i--){
            right[i]=Math.max(right[i+1],height[i+1]);
        }
        int sum = 0;
        //当前每个柱子的存水量等于柱子两边最大高度的较小值减去当前柱子高度
        for(int i=0;i<=len;i++){
            int temp = Math.min(left[i],right[i]);
            sum+=Math.max(0,temp-height[i]);
        }
        return sum;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值