算法-数组:找出符合某条件的最大矩形区域

【数据结构与算法】之深入解析“矩形区域不超过K的最大数值和”的求解思路与算法示例 一、题目要求 给你一个 m x n 的矩阵 matrix 和一个整数 k,找出并返回矩阵内部矩形区域的不超过 k 的最大数值和。 题目数据保证总会存在一个数值和不超过 k 的矩形区域。 示例 1: 输入:matrix = [[1,0,1],[0,-2,3]], k = 2 输出:2 解释:蓝色边框圈出来的矩形区域 [[0, 1], [-2, 3]] 的数值和是 2,且 2 是不超过 k 的最大数字(k = 2)。 示例 2: 输入:matrix = [[2,2,-1]], k = 3 输出:3 阅读详情
AI摘要

该博客展示了一段Java代码,定义了Point、Rect和Method类。Point类表示点坐标,Rect类表示矩形,Method类用于操作二维数组,可绑定数组、查找最大矩形面积并绘制。最后在JavaApp类的main方法中进行测试,根据输入参数处理数组并输出结果。

import java.lang.String;

class Point {

    private int x = 0;
    private int y = 0;        //点的(X,y)坐标;数组表示为:arr[y][x]

    Point() {}
    Point(int pX, int pY){ setPoint(pX, pY); }
    Point(Point point){ setPoint(point); }
    public int getX(){ return x; }
    public int getY(){ return y; }
    public void setPoint(int pX, int pY) {
        x = pX;
        y = pY;
    }
    public void setPoint(Point point) {
        x = point.getX();
        y = point.getY();
    }

    public Point right(){ return new Point((x+1),y); }
    public void right(int n){ x = x + n; }
    public Point down(){ return new Point(x,(y+1)); }
    public void down(int n){ y = y + n; }
    public Point rightdown(){ return new Point( (x+1), (y+1) ); }
    public Point newPointBy(int X,int Y){ return new  Point( (x+X), (y+Y) ); }
    public Point newPointBy(Point point){ return newPointBy( point.getX(), point.getY() ); }
}

class Rect {

    private Point pStart;        //矩形的左上坐标
    private Point pEnd;                //矩形的右下坐标

    Rect() {
        pStart = new Point();
        pEnd   = new Point();
    }
    Rect(int pX, int pY) {
        pStart = new Point(pX,pY);
        pEnd   = new Point(pX,pY);
    }
    Rect(int pSX, int pSY,int pEX, int pEY) {
        pStart = new Point(pSX,pSY);
        pEnd   = new Point(pEX,pEY);
    }
    Rect(Point pS, Point pE) {
        pStart = new Point(pS);
        pEnd   = new Point(pE);
    }

    public Point getStartPoint(){ return pStart; }
    public Point getEndPoint(){ return pEnd; }
    public void setRectStart(Point point){ pStart.setPoint(point); }
    public void setRectStart(int pX,int pY){ pStart.setPoint(pX,pY); }
    public void setRectEnd(Point point){ pEnd.setPoint(point); }
    public void setRectEnd(int pX,int pY){ pEnd.setPoint(pX,pY); }
    public void setRect(Point pS, Point pE){
        pStart.setPoint(pS);
        pEnd.setPoint(pE);
    }

    public int getAcre() {
        return 0;
    }
    public int getRound() {
        return 0;
    }

}

class Method {

    private int[][] ary;
    private int X,Y;

    //绑定Method的操作数组;
    public boolean arrBind(int[][] arrData) {
        if(arrData.length>=2) {
            if(arrData[1].length>=2) {
                ary = arrData;
                return true;
            }
        }
        showFaildString();
        ary = null;
        return false;
    }
    public boolean arrBind(int x, int y) {

        if( (x>20)||(y>20) ) {
            showFaildString();
            return false;
        }
        ary = new int[y][x];
        for(int i=0; i<y; i++) {
            for(int j=0; j<x; j++) {
                ary[i][j] = random_01();
            }
        }
        return true;
    }
    public void arrDisConnect() {
        ary = null;
    }

    public Rect maxArea() {

        if(!checkBind()) return null;
        boolean bFound = false;
        Point pStart = new Point();
        Point pEnd;
        Rect rRetVal = new Rect();

        for(int i=0; i<ary.length; i++) {
            for(int j=0; j<ary[i].length; j++) {
                //如果该点值为'0',生成最大矩形;
                if(ary[i][j]==0) {
                    pStart.setPoint(j,i);
                    pEnd = getMaxEndPoint(pStart);
                    if(pEnd!=null) {
                        rRetVal.setRect( pStart, pEnd );
                        bFound = true;
                    }
                }
            }
        }
        if(bFound)
            return rRetVal;
        else
            return null;
    }
    public void drawArea(Rect area) {
        if(!checkBind()) return;
        System.out.println("Start---------------------------------------------");
        for(int i=0; i<ary.length; i++) {
            System.out.print("  ");
            for(int j=0; j<ary[i].length; j++){
                if( (area.getStartPoint().getX()<=j)&&(j<=area.getEndPoint().getX())&&(area.getStartPoint().getY()<=i)&&(i<=area.getEndPoint().getY()) )
                    System.out.print(" *");
                else
                    System.out.print(" "+ary[i][j]);
            }
            System.out.println("");
        }
    }
    public void drawArea() {
        if(!checkBind()) return;
        System.out.println("Start---------------------------------------------");
        for(int i=0; i<ary.length; i++) {
            System.out.print("  ");
            for(int j=0; j<ary[i].length; j++){
                System.out.print(" "+ary[i][j]);
            }
            System.out.println("");
        }
    }
    public int getLastMaxAreaSize() {
        if(!checkBind()) return -1;
        return X*Y;
    }
    //形式成最大矩形 返回第1最大矩形面积终点坐标
    private Point getMaxEndPoint(Point pStart) {
        boolean bFound = false;
        if(!checkBind()) return null;
        if(!isValidStart(pStart)) return null;
        if(!isZero(pStart.right())) return null;
        if(!isZero(pStart.down())) return null;
        if(!isZero(pStart.rightdown())) return null;

        int x=0,y;
        do {
            x++;
            y=1;
            while((ary.length>(pStart.getY()+y+1))&&appendH(pStart,x,y)) {
                y++;
            }

            if( (x+1)*(y+1)>(X+1)*(Y+1) ) {
                X = x;
                Y = y;
                bFound = true;
            }
        }while((ary[pStart.getY()].length>(pStart.getX()+x+1))&&appendW(pStart,x,1));

        if(bFound)
            return pStart.newPointBy(X,Y);
        else
            return null;
    }
    //横向(右)追加矩形面积 成功返回true
    private boolean appendW(Point pThis, int X, int Y) {
        int xVal = pThis.getX()+X+1;
        for(int i=0; i<=Y; i++) {
            if(ary[pThis.getY()+i][xVal]==1)
                return false;
        }
        return true;
    }
    //纵向(下)追加矩形面积 成功返回true
    private boolean appendH(Point pThis, int X, int Y) {
        int yVal = pThis.getY()+Y+1;
        for(int i=0; i<=X; i++) {
            if(ary[yVal][pThis.getX()+i]==1)
                return false;
        }
        return true;
    }
    private boolean isZero(int pX,int pY){ return (ary[pY][pX]==0)?true:false; }
    private boolean isZero(Point pStart){ return isZero(pStart.getX(),pStart.getY()); }
    private boolean isValidStart(int pX, int pY){ return isZero(pX,pY)?( (ary.length<=(pY+1))||(ary[pY].length<=(pX+1))?false:true ):false; }
    private boolean isValidStart(Point pStart){ return isValidStart(pStart.getX(),pStart.getY()); }
    private boolean checkBind() {
        if(ary==null) {
            showFaildString();
            return false;
        }

        return true;
    }
    private int random_01(){
        //return 1;
        return (Math.random()*10>7)?1:0;
    }
    private void showFaildString() {
        System.out.println("Method.ary is null;");
    }
}


public class JavaApp {

    public static void main(String[] args) {

        int arr[][] = {
            {1, 1, 1, 1, 0, 0, 1},
            {1, 0, 0, 1, 0, 0, 1},
            {0, 0, 0, 0, 0, 0, 0},
            {1, 0, 1, 0, 1, 0, 1},
            {1, 0, 1, 0, 0, 1, 1},
            {1, 0, 0, 0, 0, 1, 1},
            {1, 0, 0, 0, 0, 1, 0},
        };

        Rect myRect;
        Method meth = new Method();
        Point pStart, pEnd, pTemp;

        switch(args.length) {
            case 1:
                if(!meth.arrBind(Integer.parseInt(args[0]),Integer.parseInt(args[0]))) System.exit(0);
                break;
            case 2:
                if(!meth.arrBind(Integer.parseInt(args[0]),Integer.parseInt(args[1]))) System.exit(0);
                break;
            default:
                if(!meth.arrBind(arr)) System.exit(0);
                break;
        }

        meth.drawArea();

        myRect = meth.maxArea();
        if(myRect==null) {
            System.out.println("not found;");
        }
        else
            meth.drawArea(myRect);

        meth.arrDisConnect();        //System.gc();
    }
}

【NCBI】SRA toolkit安装及使用-Windows&Linux版本 由于市面上的文章介绍SRA toolkit基本上都是基于Linux,而在windows下运行SRA toolkit基本上可以达到相同的效果且更为方便,故本文将分别阐明在Windows和Linux环境下SRA toolkit的安装及使用。 阅读详情

相关推荐

树莓派CSI/DSI二合一接口深度玩法:同时驱动MIPI摄像头和屏幕的配置秘籍

本文详细解析了树莓派5上CSI/DSI二合一接口的深度玩法,提供了同时驱动MIPI摄像头和屏幕的完整配置秘籍。从硬件连接到软件设置,包括config.txt的优化配置,帮助用户充分利用树莓派5的双多功能接口,实现高效的双设备工作模式。

weixin_30687051的博客 573

力扣_数组25—柱状图中最大的矩形

题目 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 思路 暴力法: 有下述事实:最大矩形的高度一定等于某个柱子的高度 遍历每个柱子(对于柱子 iii,其高度为 heights[i]heights[i]heights[i]),计算当矩形高度等于 heights[i]heights[i]heights[i] 时所能构成的矩形的最大面积 找到第 iii 个柱子向左向右所能延申的最大宽度,即找到左边第一个小于 heig

qweasdwxc的博客 1049

企业信息化系统的组成模块-核心业务系统

通过标准化的数据流形成完整的业务闭环,CRM生成的销售订单驱动ERP的生产和采购,ERP将生产计划传递给MES执行,MES报工数据返回ERP进行成本核算,ERP再将交付信息同步给CRM供客户查询。生产管理确保高效交付,缩短订单周期。某贸易公司实施ERP供应链模块后,库存周转率从每年4次提升到8次,库存资金占用从2000万降到1200万,释放800万现金流,同时缺货率从15%降到5%。│ │库存 │ │ MRP │ │ ERP │ │ 云ERP/ │ │。

weiyvyy的博客 694

数组中的最大矩形(tiger基金的笔试题)

总体思想呢:就是把每一个bar为标准得到矩形(找到它左右两边的比它小的值来计算)来进行比较,这样就不会重复不会漏掉了。(两种方法下面绿色和红色标注的)

xuehuagongzi000的博客 552

Unity多渠道APK打包:同一工程稳定输出不冲突安装包

Android应用多渠道分发是移动开发的基础场景,其核心在于解决包名唯一性、渠道可识别性与构建可重复性三大问题。原理上,Unity安卓打包本质是三阶段流程:生成Android工程、Gradle编译、APK签名,而包名冲突根源在生成阶段对PlayerSettings的强依赖。技术价值体现在规避人工配置失误、支撑CI/CD自动化、满足华为/小米等商店合规要求。典型应用场景包括应用宝、TapTap、B站等渠道独立包管理,以及AB测试、灰度发布等运营需求。本文聚焦Unity原生方案,通过BuildPlayerOpt

weixin_33736048的博客 794

Carsim和Matlab/Simulink联合仿真时Carsim匹配不到Matlab的解决方法

      本人使用Carsim和Matlab/Simulink联合仿真做过用机器学习方法解决ACC和简单换道的仿真,曾将8.02 2016 2018三个版本Carsim反复安装N次,有相同方向的同学或安装过程遇到问题的同学可以加本人qq505625869一起交流经验心得。 一.前言       Carsim是一款很好的联合仿真软件,使用Carsim,可以避免搭建很多非常复杂的动力学模型

Kaikai_Liao的博客 8766

最大矩形

###最大矩形 ####原题 在一个位图中找面积最大的白色矩形:给你一个NxN的黑白位图,找一个面积最大的全白色的矩形。注意了,是一个矩形,不是任意一个白色相连的区域。你的算法能够达到的最好的时间复杂度是多少呢? ####分析 为了方便进行分析,我们假设黑色位置都是0,白色的位置都是1.题目的问题就转化为,找到一个最大的矩形,其中所有的元素都是1. 遇到这样的题目,该如何分析呢?这是一个矩形,是二...

ailinyingai的博客 1881

【GAN实战】基于pytorch-CycleGAN与pix2pix的自定义数据集训练全攻略

本文详细解析了基于PyTorch的CycleGAN与pix2pix模型在自定义数据集上的完整训练流程。核心在于根据数据是否成对来正确选择模型:pix2pix适用于严格配对的“孪生”数据,而CycleGAN则擅长处理非配对的“散装”数据集。文章从数据准备、配置训练到测试应用,提供了全链路实战指南与关键参数调优心得,帮助开发者高效实现图像到图像的风格转换。

x2y3z4a5b的博客 704

直方图中最大的矩形_直方图中最大的矩形区域

直方图中最大的矩形Problem statement: 问题陈述: Find the largest rectangular area possible in a given histogram where the largest rectangle can be made of a number of contiguous bars. For simplicity, assume that ...

cumt30111的博客 570

道家学派创始人老子,对 SAP ABAP 这门编程语言的客观评价

SAP HANA 之引入,使 ABAP 于处理大数据,云计算等新兴领域,展现新的生命力,如老吾老以及人之老,幼吾幼以及人之幼,扩展其在信息技术领域的应用,以涵养更广之需。ABAP 能以数据为基,流转于系统之中,如道法自然,顺应企业之生态,助之以高效运转,减少冗杂,简化管理,使企之运营,如小国寡民,无为而治。然 ABAP 如老树盘根,更替不易,面对新兴技术,如云计算、大数据等,其更新之速,未能与时俱进。如水之于渊,柔而能胜刚,ABAP 之发展,顺时而动,应需而变,其在编程领域,犹如道之于万物,渐不可或缺矣。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1021

学Simulink--基础微电网场景实例:基于Simulink的微电网黑启动过程建模与仿真

黑启动(Black Start)是指在全系统停电(无电压、无频率)状态下,微电网依靠内部电源自主恢复供电的能力。🌩️典型场景主网长时间故障自然灾害导致区域停电计划检修后重启❗挑战无参考电压/频率 → 逆变器无法锁相负荷逐级投入 → 需避免过流/过压多电源协调 → 防止环流或失步✅黑启动成功标准在30 秒内恢复关键负荷供电电压/频率稳定在范围内无设备损坏或保护跳闸🎯本文目标:手把手教你使用 Simulink + Simscape + Stateflow 搭建。

amy_mhd的博客 200

【数据结构与算法】二维数组 最大矩形和

使用Kadane算法可以很方便地求解一维数组的最大连续子序列之和。 下面是Kadane算法的延伸,在二维数组中求解最大矩形。 思路是要利用一维数组的求解方法来求解二维,假设现在要求以i列开始到j列结束的最大和,不能是i和j之间的,必须以i和j是开始和结束。可以把i和j之间的列相加,最终得到一个一维数组,那么这个一维数组的最大值就是i和j的最大值,这是因为这个一维数组中存的就是每一行的和,与co

u010900754的专栏 2451

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

题解 # 二维矩阵最大矩形问题#

解决二维矩阵最大矩形问题

如是牛 2178

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

数组中对打矩形区域为1的数量

题目: 给定一个矩形矩阵map,其中的值只有0和1两种,求其中全是1的所有矩形区域中,最大的矩形区域为1的数量。 例如:1 0 1 1          1 1 1 1          1 1 1 0 其中,最大的矩形区域有6个1,所以返回6. 思路:将问题的整个矩阵分成以每行为底的分问题,从上至下,先是以第一行为底,第一行是一个一维数组,这里还是要用到单调栈的概念,从数组开头开始扫

grave2015的博客 564

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【算法奥义】最大矩形问题

【代码】【算法奥义】最大矩形问题。

qingshanlvshui9的博客 994

算法第十二天-矩形区域不超过K的最大数值和

来自[宫水三叶]从题面来看显然是一道[二维前缀和]的题目。本题预处理前缀和的复杂度为O(m* n)搜索所有子矩阵需要枚举[矩形左上角]和[矩形右下角],复杂度是Om2∗n2,因此,如果把本题当作二维前缀和模板题来做的话,整体复杂度为Om2∗n2数据范围是102,对应的计算量是108,理论上会超时,但当我们枚举[矩形左上角](i,j)的时候,我们只需要搜索位于(i,j)的右下方的点(p,q)作为[矩形右下角],所以其实我们是取不满m2∗n2。

weixin_43186779的博客 1270

363. 矩形区域不超过 K 的最大数值和

前缀和

u013243296的博客 153

《算法竞赛进阶指南》直方图中最大的矩形

直方图中最大的矩形 直方图是由在公共基线处对齐的一系列矩形组成的多边形。 矩形具有相等的宽度,但可以具有不同的高度。 例如,图例左侧显示了由高度为2,1,4,5,1,3,3的矩形组成的直方图,矩形的宽度都为1: 2559_1.jpg 通常,直方图用于表示离散分布,例如,文本中字符的频率。 现在,请你计算在公共基线处对齐的直方图中最大矩形的面积。 图例右图显示了所描绘直方图的最大对齐矩形。 输入格式 输入包含几个测试用例。 每个测试用例占据一行,用以描述一个直方图,并以整数n开始,表示组成直方图的矩形数目。

qq_42635159的博客 470

LeetCode第 363 题:矩形区域不超过 K 的最大数值和 (C++)

363. 矩形区域不超过 K 的最大数值和 - 力扣(LeetCode) 第一感觉是和LeetCode第 862 题:和至少为K的最短子数组 (C++)_qq_32523711的博客-优快云博客比较类似,而且矩阵元素和子数组都有连续的特点,所以这题先计算前缀和试一试。 ...

zj 521

【Leetcode 热题 100】84. 柱状图中最大的矩形

Leetcode 热题 100 - 柱状图中最大的矩形

冠位优化 836

题目16: 矩形嵌套

矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度)。例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中。你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩

落日小屋 2040

矩阵区域不超过K的最大值和

矩阵区域不超过K的最大值和 问题描述: 给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大数值和。题目数据保证总会存在一个数值和不超过 k 的矩形区域。 输入:matrix = [[1,0,1],[0,-2,3]], k = 2 输出:2 输入:matrix = [[2,2,-1]], k = 3 输出:3 思路:记 l,rl , rl,r分别为matrix的可移动左右边界(l:0−col,r:l−coll:0-col, r: l-coll:0−c

qq_34233136的博客 311

单调栈之柱状图最大矩形,每日温度

LeetCode 84. 柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。 方法一:暴力解法 具体来说就是:依次遍历柱形的高度,对于每一个高度分别向两边扩散,求出以当前高度为矩形的最大宽度多少。 左边看一下,看最多能向左延伸多长,找到大于等于当前柱形高度的最左边元素的下标; 右边看一下,看最多能向右延伸多长;找到大于等于当前柱形高度的

AndyJ的学习之旅 227

LeetCode 363. 矩形区域不超过 K 的最大数值和【二维前缀和+枚举+二分】困难

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。。

memcpy0的博客 441

树状数组 求区间最大+暴力剪枝 ??单调队列?? Planting Trees

牛客多校 链接:https://ac.nowcoder.com/acm/contest/883/F 来源:牛客网 题目描述 The semester is finally over and the summer holiday is coming. However, as part of your university’s graduation requirement, you have to t...

Up Panda 172

84 柱状图中最大的矩形

首先这道题整体的思路上分为:求出每个位置的最大矩形面积,然后整体选择最大的那个。在此基础上,要直到最近的下标,可以用单调栈来保存,然后将符合的结果分别放到left和right数组中进行保存。若栈中没有数据,那么left里面放-1,right里面放n。给定 n 个非负整数,用来表示柱状图中各个柱子的高度。输入:heights = [2,1,5,6,2,3]那么面积就是:h⋅(right−left−1)。求在该柱状图中,能够勾勒出来的矩形的最大面积。解释:最大的矩形为图中红色区域,面积为 10。

谜底的博客 334
上一篇: 利用ASP实现事务处理的方法(摘)
下一篇: 算法-数组:螺旋数字排列
FBugFramework
博客等级 码龄23年 25粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值