CC150 20.11

20.11 Imagine you have a square matrix, where each cell is filled with either black or white. Design an algorithm to find the maximum subsquare such that all four borders are filled with black pixels.

// A brute force solution.
// n * n
// iterate from n to 1.
// For n, find all possible sub square

Enum Color
{
  BLACK, WHITE;
}

// Check sub square (left-up point [row][col], length) has all borders black
// Assume square is not null, N * N matrix (N >= 1)
// row and col >= 0
// row + len < square.length
// col + len < square.length
boolean hasBlackBorders(Color[][] square, int row, int col, int len)
{
  for (int i = 0 ; i < len ; i ++)
  {
    if (square[row + i][col] != BLACK) // left
      return false;
    if (square[row + i][col + len - 1] != BLACK) // right
      return false;
    if (square[row][col + i] != BLACK) // up
      return false;
    if (square[row + len - 1][col + i] != BLACK) // up
      return false;  
  }
  return true;
}

// O(n^)
void maxSubSquareWithBlackBorders(Color[][] square)
{
  int maxLen = square.length;
  for (int len = maxLen ; len > 0 ; len --)
  {
    // Given len, find possible left-up start
    for (int row = 0 ; row < maxLen - len + 1 ; row ++)
    {
      for (int col = 0 ; col < maxLen - len + 1 ; col ++)
      {
        if (hasBlackBorders(square, row, col, len))
        {
          // Return the sub square with left-up point[row][col], and len.
          return;
        }
      }
    }
  }
  return null;
}

// A better solution?
class Node
{
 Color color;
 Integer maxDownRight;
 Integer maxUpLeft;
 boolean hasMaxDownRight();
}

// O(n)
// Populate the max down/right this node can go.
void populateDownRight(Node[][] square, int row, int col)
{
  int maxLen = square.len;
  
  if (square[row][col].color == WHITE)
    return;
  
  int down = 0;
  if (row > 0 && square[row - 1][col].hasDownRight())
    down = square[row - 1][col].downRight - 1;
  else
  {
    for (int = row + 1 ; i < maxLen ; i ++)
    {
      down ++;
    }
  }
  
  int right = 0;
  // Similar to calculate down
  
  square[row][col].downRight = min(down, right);
}

// void populateUpLeft(Node[][] square, int row, int col)
// Similar to populateDownRight

O(n ^ 3)
void maxSubSquareWithBlackBorders(Node[][] square)
{
  // Populate down right
  for (int i = 0 ; i < maxLen ; i ++)
  {
    for (int j = 0 ; j < maxLen ; j ++)
    {
      populateDownRight(i, j);
    }
  }
  
  // Populate up left
  for (int i = 0 ; i < maxLen ; i ++)
  {
    for (int j = 0 ; j < maxLen ; j ++)
    {
      populateUpLeft(maxLen - i, maxLen - j);
    }
  }
  
  // Find maxOne.
  Node toReturn;
  
  int maxLenSeen = -1;
  for (int i = 0 ; i < maxLen ; i ++)
  {
    for (int j = 0 ; j < maxLen ; j ++)
    {
      int downRight = square[i][j].downRight;
      int possibleSqureUpLeft = square[i + downRight][j + downRight].upLeft;
      if (possibleSqureUpLeft >= downRight)
      {
        // We find a square matching.
        if (downRight > maxLenSeen)
        {
          toReturn = square[i][j];
          maxLenSeen = downRight;
        }
      }
    }
    
    // Print toReturn with maxLenSeen.
  }
}
时间: 2024-11-18 02:11:48

CC150 20.11的相关文章

20.10 for循环;20.11 while循环(上);20.12 while循环(下);20.13 break跳出循环;20.14 ;20.15

20.10 for循环 案例1 1. 编写for循环脚本:计算1到100所有数字和: [[email protected] ~]# vi for1.sh 添加内容: #!/bin/bash sum=0 for i in `seq 1 100` do echo "$sum + $i" sum=$[$sum+$i] echo $sum done echo $sum 2. 执行for1.sh脚本: [[email protected] ~]# sh for1.sh 案例2 1. 文件列表循环

20 11 9 5

答题详情(红色字体显示表示答案不正确):   1.  以下程序如何修改才能使得单一MyLogger对象支持多线程环境:Given: 1. public class MyLogger { 2. private StringBuilder logger = new StringBuilder(); 3. public void log(String message, String user) { 4. logger.append(message); 5. logger.append(user); 6

20.10 for循环 20.11/20.12 while循环 20.13 break跳出循环 20.14 continue结束本次循环 20.15 exit退出整个脚本

20.10 for循环 ?语法:for 变量名 in 条件; do -; done ? 案例1 1+2+3..+100的和 #!/bin/bash sum=0 for i in `seq 1 100` // seq 1到100个数字 do sum=$[$sum+$i] echo $i done echo $sum sum 第一次作为变量的时候,是0:当进入for循环里面的时候,每运算一次,sum变量就会改变一次,直至$i 结束:最后输出结果 $sum ? 案例2 文件列表循环 #!/bin/ba

20.10 for循环 20.11/20.12 while循环 20.13 break跳出循环 20

20.10 for循环语法:for 变量名 in 条件; do -; done案例1#!/bin/bashsum=0for i in seq 1 100do? ? sum=$[$sum+$i]? ? echo $idoneecho $sum文件列表循环#!/bin/bashcd /etc/for a in ls /etc/do? ? if [ -d $a ]? ? then? ?? ? ls -d $a? ? fidone 20.11/20.12 while循环语法 while 条件; do -

CC150 20.6

20.6 Describe an algorithm to find the largest 1 million numbers in 1 billion numbers. Assume that the computer memory can hold all one billion numbers. // can hold all numbers. // Cheating! // Do we know the max or min? // Consider using bitmap // I

CC150 19.11

19.11 Design an algorithm to find all pairs of integers within an array which sum to a specified value. // Assume a is not null. // // a is not sorted. // // Option 1 is using a set. List<Pair<Integer, Integer>> sumUpTo(int[] a, int sum) {   /

CC150 20.1

20.1 Write a function that adds two numbers. You should not use + or any arithmetic operators. //  Sorry I don't know. I hate questions like this.

CC150 20.2

20.2 Write a method to shuffle a deck of cards. It must be a perfect shuffle - in other words, each 52! permutations of the deck has to be equally likely. Assume that you are given a random number generator which is perfect. // Randomly generate a in

CC150 20.3

20.3 Write a method to randomly generate a set of m integers from an array of size n. Each element must have equal probability of being chosen. // Similar to 20.2 // This assume m <= n