程序员面试金典——解题总结: 9.18高难度题 18.11给定一个方阵,其中每个单元(像素)非黑即白。设计一个算法,找出四条边都是黑色像素的最大子方阵。

本文总结了程序员面试中的一道高难度问题:在黑白方阵中找出四边全为黑色的最大子方阵。通过对问题的深入分析和算法设计,为面试者提供了解题思路。
摘要由CSDN通过智能技术生成

下一专题预告:《编程珠玑》

#include <iostream>
#include <stdio.h>

using namespace std;
/*
问题:给定一个方阵,其中每个单元(像素)非黑即白。设计一个算法,找出四条边都是黑色像素的最大子方阵。
分析:暴力破解:考虑到方阵的组成只需要确定左上角坐标(x1,y1)和右下角坐标(x2,y2),因此可以通过一个四重循环来遍历生成:
                x1,y1,x2,y2,对于得到的坐标,还需要判定4条边是否为全部黑色,总的边的长度=2*(x2-x1) + 2*(y2-y1),
				因此总的时间复杂度是O(N^4)。
	  贪心:贪心选择(剩余问题是原问题的子问题)+最优子结构(子问题的最优解包含在全局最优解),应该不能用贪心,
	  递归:将方阵对半划分?不对,需要找到子问题最小的处理方式,最小就是一个像素,
	  回溯:
	  分治:
	  动态规划:
	  此题可以通过:修改判定一个方阵是否四条边全为黑色的时间复杂度从O(N)降到O(1),采用前缀和的方式进行预处理。
	  处理过程是:从右到左,从下到上,如果当前元素A[r][c]为白色,令其右侧0和下方零的个数为0,;
	                    即A[r][c].zerosRight=0,A[r][c].zerosBelow = 0;
						否则:A[r][c].zerosRight = A[r][c+1].zerosRight + 1;
						     A[r][c].zerosBelow = A[r+1][c].zerosBelow + 1;
						然后判断某个以(row,col)为左上角顶点,长度为size的方阵是否是符合指定四条边全为黑色:
						    A[row][col].zerosRight >= size && A[row][col].zerosBelow >= size && 
							A[row][col + size - 1].zerosBelow >= size && A[row + size -1][col].zerosRight >= size
							即可

						注意:对于长度为N的方阵,寻找长度为size的方阵时,共有N - size + 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值