博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
新手算法学习之路----二分法SmallestRectangle
阅读量:4933 次
发布时间:2019-06-11

本文共 2038 字,大约阅读时间需要 6 分钟。

题目:一个二维数组里面是由1和0构成的,里面所有的1都是相互关联的,有且只有一块由连续1构成的区域,请找出来最小能包括所有1的矩形,

前提:给出一个任意二维数组以及其中的一个1的元素的x和y坐标。

                             0,1,1,0

例如:int [2][3]a={

{0,0,1,0},     1   这一行含有1,映射到行边上为1

                            {0,1,1,0},      1   同上

                            {0,1,0,0}}      1   同上

解题思想:如上面的例子里面,如果一列里面有1就映射到第一行对应的位置   如上面二维数组将所有含有1的列映射到第一行就形成了蓝色字体的0110,那么矩形的宽就出来,同理到长;

                 由给定的点来将长宽分为四部分来求,二维数组中红1为给定的点,那么就可以将长宽分为点左,右,上,下边的四部分。如:先求点左边第一个 1的位置,将问题转化为蓝色部分的数组,利用二分法来求,low = 0,high = y =1;下面代码中第一个while语句。

解题中遇到的问题:1,我TMD连java二维数组申明都不会用了。

                                2,while里面是low<=high 还是low<high&&(low+1)!=high,

                                3,left right up down四个变量最后该赋予那个值是 low还是high

解决的办法:如果用low<high&&(low+1)!=high,就必须在每个while语句后判断最终的low 与high哪一个为1,然后赋值给left这样会增加空间复杂度。

                     如果是low<=high 则直接可以将left = low;

public class SmallestRectangle {           public static void main(String[] args) {             char[][]array = {
{'0','1','1','0'}, {
'0','1','1','0'}, {
'0','1','1','0'}, {
'0','1','1','0'}}; int x = minArea(array,0,1); System.out.println(x); } static int minArea(char[][] image, int x, int y) { int left,right,up,down; //这四个变量分别表示点的左,右部分第一个含有‘1’的列的列号,以及上,下第一个含有‘1’的行的行号 int low,high; //这两个变量分别表示在while里面用来寻找中点的两端 low = 0; high = y; int mid; //第一部分 while的功能是点的左边部分 while(low<=high){ //此while用来找点(x,y)右边的哥一个里面没有‘1’的列号 boolean found = false; mid = low + (high- low)/2; for(int i =0;i

 

使用模板后改的代码同样可运行:

模板为:start+1<end;

              mid=start+(end-start)/2;

              A[mid] <>==target;

              A[start],A[end]?target;

int minArea(char[][] image, int x, int y) {             int left,right,up,down;     //这四个变量分别表示点的左,右部分第一个含有‘1’的列的列号,以及上,下第一个含有‘1’的行的行号            int low,high;               //这两个变量分别表示在while里面用来寻找中点的两端            low = 0;            high = y;            int mid;                        //第一部分 while的功能是点的左边部分            while(low+1

 

转载于:https://www.cnblogs.com/junliu37/p/7136245.html

你可能感兴趣的文章
C++成员函数的重载、覆盖与隐藏【转载】
查看>>
网站开发技能图谱
查看>>
4.27随笔
查看>>
CSS实例:图片导航块
查看>>
poj1860 Currency Exchange(spfa判断正环)
查看>>
SQL CHECK 约束&Case when 的使用方法
查看>>
[整理]HTTPS和SSL证书
查看>>
[转载] Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅
查看>>
水晶苍蝇拍:聊聊估值那些事儿——“指标”背后的故事 (2011-11-01 14:58:32)
查看>>
3.每周总结
查看>>
应用提交 App Store 上架被拒绝
查看>>
Android实现异步处理 -- HTTP请求
查看>>
数据清空js清空div里的数据问题
查看>>
Fortran中的指针使用
查看>>
移动终端app测试点总结
查看>>
14-6-27&28自学内容小结
查看>>
JSP
查看>>
---
查看>>
(第一组_GNS3)自反ACl
查看>>
hdu--1258--Sum It Up(Map水过)
查看>>