首页 > 编程知识 正文

求椭圆内接最大矩形,扇形中求矩形的最大面积百度文库

时间:2023-05-04 12:33:26 阅读:34521 作者:1620

求最大矩形问题的再讨论:给出整数矩阵map,其中值只有0和1两种,在其中全部为1的所有矩形区域中,

最大的矩形区域是1的数量。

例如:

1 1 1 0

其中,最大的矩形区域有3个1,所以返回3。

例如:

1 0 1 1

1 1 1 1

1 1 1 0

其中,最大的矩形区域有六个1,所以返回6

问题分析:看到这个问题,我们应该首先考虑使用单调堆栈。 使用单调堆栈找到左右低于当前高度的最低位置。 然后,其间的矩形最大,向左或向右移动则高度小于当前高度,所以不行。 求最大矩形时,最大的可能不包含最后一行,矩形的底部可能在任意行,因此每隔一行计算最大矩形。

解法:单调堆栈

问题:代码: package cn.basic.algorithm; import java.util.Stack; /** * @author FOLDN *最大矩形*/publicclassmaxrect { publicstaticvoidmain [ ] args ] {/int [ ] [ ] map={1} int [ ] [ ] intsize=maxrectsize(map; system.out.println(size; (publicstaticintmaxrectsize (int [ ] ) map ) if ) map==null|| map.length==0||map [0].length==0) rength //创建一个int数组,其中包含每列的第一个数int [ ] height=new int [ map [0].length ]; for(intI=0; i map.length; I ) for(intj=0; j map[0].length; j ) (/如果对应位置为1,则对应于该列的height 1 height[j]=map[i][j]==1? height[j] 1 : 0; }maxarea=math.max(maxarea,maxrectfrombottom(height ); }返回矩阵; } publicstaticintmaxrectfrombottom (int [ ] height ) if ) height==null||height.length==0) { return 0; //被创建用于给出int值以存储最大值0 int maxArea=0; //创建求最大矩形堆栈积分器堆栈=新堆栈的堆栈; for(intI=0; i height.length; I () { while (! 如果堆栈. isempty (height [ stack.peek ]=height [ I ] )//堆栈不为空,且与堆栈顶部元素对应的数组值大于当前数组值,则堆栈顶部元素integer integer -1 : stack.peek (; intarea=height [ index ] * (I-1-left; maxArea=math.max(Area,Maxarea ); //经过以上循环,此时添加的数组下标对应的数组值不破坏堆栈的单调性stack.push(I ); //最后一个堆栈可能包含元素,请取出这些元素,然后单击while (! stack.isEmpty () ({ Integer index=stack.pop ); int left=stack.isEmpty (? -1 :stack.peek (; intarea=height [ index ] * ((height.length-1 )-left ); maxArea=math.max(Area,Maxarea ); }返回矩阵; }代码分析代码定义了两种方法。 一种方法是使用二维数组中每行的分隔符作为矩形的底部来确定最大矩形,另一种方法是计算最大矩形。 重点是第二种方法。 第二种方法首先创建整数变量和堆栈。 整数变量用于存储最大的矩形,堆栈用于对数组元素进行排序,以找到每个元素左右两侧比自己小的最近的元素。 遍历height数组。 在循环中,如果堆栈不为空,并且当前数组元素小于与堆栈顶级元素相对应的数组元素,则弹出堆栈的顶级元素。 这是因为重复当前操作,直到当前元素被推入堆栈时,堆栈的单调性被破坏,堆栈的单调性不再被破坏。 弹出堆栈顶部元素时,此时的堆栈顶部元素的下方,该元素是左侧的最近值,被按下的值是右侧的最近值,可以根据这两个左右的最近值来计算最大矩形尺寸。 遍历653http://www.Sina.com/)数组后,堆栈中可能还存在元素。 必须弹出堆栈中的元素进行计算。 此时,由于堆栈中的所有元素都在右侧没有比他大的元素,因此在计算时将添加当前元素右侧的所有矩形。 如果顶部元素下没有元素,则计算左侧的所有元素。

摘要:单调堆栈:堆栈中的元素按规则排序,如果推入的元素不符合规则,队列末尾的元素将弹出直到满足规则。 (只能操作堆栈顶部)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。