题4:边长为1的最大子方阵优化 预处理 对每个位置上为1的元素找右边下边有多少个1 1 1 1 0 1 1 0 1 1 1 0 1 0 1 1 1 3,3 2,4 1,0 0,0 2,2 1,3 0,0 1,3 2,1 1,2 0,0 1,2 0,0 3,1 2,1 1,1 (右,下)//算上自身 [3],[3] 2,[4] [2], 2 1, 3 只需要看这四个数就可以确定一个正方形 //输出右下1个数的矩阵 private static void print(int[][][] rec,int N){ for(int i=0;i<N;i++){ for(int j=0;j<N;j++){ System.out.print(rec[i][j][0]+","+rec[i][j][1]+"\t"); } System.out.println(); } } //全局变量 int[][][]res;//保存1右下个数的数组 //生成右边和下边的1的数量的数组 private static void generateHelpRec(int[][] A){ int N=A.length; res=new int[N][N][2]; //最后一行 int row=N-1; //初始化最下面一层 for(int j=N-1;j>=0;j--){ int value=A[row][j]; if(value==1){ if(j==N-1) {rec[row][j][0]=1;}//右侧连接1的个数,最底层 else {rec[row][j][0]=rec[row][j+1][0]+1;} res[row][j][1]=1; } } row--; for(int i=row;i>=0;i--){ for(int j=N-1;j>=0;j--){ int value=A[i][j]; if(value==1){ if(j==N-1) rec[i][j][0]=-1; else rec[i][j][0]=1=rec[i][j+1][0]+1; res[i][j][1]=res[i][j][1]+1;//向下连接的个数 } } } return } //检查四条边是否正确 private static boolean check(int i,int j,int n){ //左上角那个点往右数的1的数目要≥n //左上角那个点往下数的1的数目要≥n //右上角那个点往下数的1的数目要≥n //左下角那个点往右数的1的数目要≥n if(rec[i][j][0]>=n&&rec[i][j][1]>=n&&rec[i][j+n-1][1]>=n&&rec[i+n-1][j][0]>=n) return true; return false; } private static int solve(int[][] A){ int N=A.length; int n=N; while(n>0){ for(int i=0;i<N;i++){ l3; if(i+n>N)break;//越界 for(int j=0;j<N;j++){ if(j+n>N)break;//越界 //检查四个边 if(check(i,j,n)) return n; } } } } //这种从底层往上求的方式类似于动态规划里的打表法
蓝桥杯算法基础(25)边长为1的最大子方阵优化
湖前一人对影成双2024-03-19 17:18
相关推荐
焜昱错眩..23 分钟前
代码随想录算法训练营第三十九天|62.不同路径 63.不同路径ll焦耳加热4 小时前
阿德莱德大学Nat. Commun.:盐模板策略实现废弃塑料到单原子催化剂的高值转化,推动环境与能源催化应用wan5555cn4 小时前
多张图片生成视频模型技术深度解析u6064 小时前
常用排序算法核心知识点梳理蒋星熠7 小时前
Flutter跨平台工程实践与原理透视:从渲染引擎到高质产物小欣加油7 小时前
leetcode 面试题01.02判定是否互为字符重排3Cloudream7 小时前
LeetCode 003. 无重复字符的最长子串 - 滑动窗口与哈希表详解王璐WL7 小时前
【c++】c++第一课:命名空间空白到白8 小时前
机器学习-聚类索迪迈科技8 小时前
java后端工程师进修ing(研一版 || day40)