新手算法学习之路----二分法SmallestRectangle

题目:一个二维数组里面是由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<image.length;i++){  //image.length是二维数组的行号,用来对比一整列里面是否含有‘1’
                    if(image[i][mid]==‘1‘){
                        found = true;
                        break;
                    }
                }
                if(found)
                    high = mid-1;
                else
                    low = mid+1;
            }
            left= low;   //

            //第二部分while功能是点的右部分。
            low = y;
            high = image[x].length-1;                // image[x].length 为二维数组列的长度。
            while(low<high){
                boolean found_right = false;
                mid = low+(high-low)/2;
                for(int i = 0;i<image.length;i++){
                    if(image[i][mid]==‘1‘){
                        found_right = true;
                        break;
                    }
                }
                if(found_right) low = mid+1;
                else high = mid-1;
            }
            right = low;

            //第三个while的作用是找到点0到x所有的含有‘1’的行的行号
            low = 0;
            high = x;

            while(low<=high){
                boolean found_up = false;
                mid = low+ (high-low)/2;
                for(int i =0;i<image[x].length;i++){
                    if(image[mid][i]==‘1‘){
                        found_up = true;
                        break;
                    }
                }
                if(found_up)  high = mid-1;
                else low = mid+1;
            }
            up = low;            

            //第四个while的作用是找到点0到x所有的含有‘1’的行的行号
            low = x;
            high = image.length-1;
            while(low<=high){
                boolean found_down = false;
                mid = low+ (high-low)/2;
                for(int i =0;i<image[x].length;i++){
                    if(image[mid][i]==‘1‘){
                        found_down = true;
                        break;
                    }
                }
                if(found_down)  low = mid+1;
                else high = mid-1;
            }
            down = low;
            return (right-left)*(down-up);         

    }
时间: 2024-10-29 13:57:06

新手算法学习之路----二分法SmallestRectangle的相关文章

新手算法学习之路----二分法Search-A-2D-Matrix

题目:      写出一个高效的算法来搜索 m × n矩阵中的值. 这个矩阵具有以下特性: 1 每行中的整数从左到右是排序的. 2 每行的第一个数大于上一行的最后一个整数. 考虑下列矩阵: [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] 给出 target = 3,返回 true  解题思路: 首先在第一列上面找到target值所在的行号,可以先找到第一个大于target的行号,那么target值肯定在上一行(如果含有多行):然后,根据查

新手算法学习之路----二分法Find Minimum in Rotated Sorted Array

题目:假设一个旋转排序的数组其起始位置是未知的(比如0 1 2 4 5 6 7 可能变成是4 5 6 7 0 1 2). 你需要找到其中最小的元素. 你可以假设数组中不存在重复的元素. 思路:首先排除三种极端情况,空,只有一个元素,以及整个数组都是顺序排列的. 当顺序的数组随机旋转排列后,就分为两个顺序列入题目中的4567和012,寻找到中间数来和数组最后一个元素对比,如果大于的话说明最小的数在中间数的右边,如果小于的话说明最小数在中间数的左边,然             后继续按照二分法来找.

新手算法学习之路----二分法Maximum-in-Mountain-Sequence

题目:在一个先升序后降序的数组中找到最大值,如果没找到就返回-1: [ 1,4,6,8,6,4,3,2] return 8; [10,9,8,7,6,5]   return 10 思路:由于没有像其他数列一样给出一个特定值,这个时候需要一个可以用找到中间值M1 和M1+1进行判断,如果[M1] >[M1+1],就可以判断此时M1和M1+1在降序上:如果[M1]<[M1+1]说明M1 和 M1+1在升序上. 代码: int SearchMaximum(int []arry){ int start

新手算法学习之路----二分法Search-for-a-Range

题目:给定一个包含 n 个整数的排序数组,找出给定目标值 target 的起始和结束位置. 如果目标值不在数组中,则返回[-1, -1] 思路:如果中点等于target就要分为两部分来查找,中点的左右部分分别来找第一个和最后一个target值:左边,只考虑mid值小于和等于target值:右边只考虑mid值大于和等于target值 public static int[] searchRange(int[] A, int target) { int start=0, end = A.length-

新手算法学习之路----二叉树(二叉树的路径和)

题目:  给定一个二叉树,找出所有路径中各节点相加总和等于给定 目标值 的路径. 一个有效的路径,指的是从根节点到叶节点的路径. 代码加思路: public List<List<Integer>> binaryTreePathSum(TreeNode root, int target) { List<List<Integer>> Result = new ArrayList<>(); List<Integer> path= new A

新手算法学习之路----宽度优先算法

题目:给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问) 给一棵二叉树 {3,9,20,#,#,15,7} : 3 / 9 20 / 15 7 返回他的分层遍历结果: [ [3], [9,20], [15,7] ] 思路:宽度优先的步骤是,从图中某一个顶点出发,首先访问vi 然后任选一个vi 的未访问的过的邻接点vj,就这样继续访问下去.java代码: public ArrayList<ArrayList<Integer>> levelOrder(TreeNode root

新手算法学习之路----二叉树(二叉树最大路径和)

摘抄自:https://segmentfault.com/a/1190000003554858#articleHeader2 题目: Given a binary tree, find the maximum path sum. The path may start and end at any node in the tree. For example: Given the below binary tree, 1 / 2 3 Return 6. 思路:首先我们分析一下对于指定某个节点为根时,

我的算法学习之路

关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口--况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的. 这篇文章讲了什么? 我这些年学习数据结构和算法的总结. 一些不错的算法书籍和教程. 算法的重要性. 初学 第一次接触数据结构是在大二下学期的数据结构课程.然而这门课程并没有让我入门--当时自己正忙于倒卖各种MP3和耳机,对于这些课程根本就不屑一顾--反正最后考试划个重点也能过,于是这门整个计算机专业本

Peng Gong:我的算法学习之路

原文出处: Lucida (@peng_gong) 关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口--况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以我认为本文题目是合理的. 这篇文章讲了什么? 我这些年学习数据结构和算法的总结. 一些不错的算法书籍和教程. 算法的重要性. 初学 第一次接触数据结构是在大二下学期的数据结构课程.然而这门课程并没有让我入门--当时自己正忙于倒卖各种MP3和耳机,对于这些课程根本就不屑一顾--