Advertisement
Guest User

1292. Maximum Side Length of a Square with... Accepted

a guest
Feb 28th, 2020
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.35 KB | None | 0 0
  1. class Solution {
  2. public:
  3.     vector<vector<int>> get_prefix_sum(const vector<vector<int>>& mat)
  4.     {
  5.         vector<vector<int>> prefix_sum(mat.size(), vector<int>(mat[0].size()));
  6.         for (int i = 0; i < mat.size(); i++)
  7.         {
  8.             for (int j = 0; j < mat[i].size(); j++)
  9.             {
  10.                 int left = j - 1 >= 0 ? prefix_sum[i][j - 1] : 0;
  11.                 int top = i - 1 >= 0 ? prefix_sum[i - 1][j] : 0;
  12.                 int left_top = j - 1 >= 0 && i - 1 >= 0 ? prefix_sum[i - 1][j - 1] : 0;
  13.                
  14.                 prefix_sum[i][j] = left + top - left_top + mat[i][j];
  15.             }
  16.         }
  17.         return prefix_sum;
  18.     }
  19.    
  20.     int get_side_sum(
  21.         int side_max,
  22.         const vector<vector<int>>& prefix_sum,
  23.         const vector<vector<int>>& mat
  24.     )
  25.     {
  26.         int current_min = numeric_limits<int>::max();
  27.         for (int i = 0; i < mat.size(); i++)
  28.         {
  29.             for (int j = 0; j < mat[i].size(); j++)
  30.             {
  31.                 current_min = min(
  32.                     current_min,
  33.                     get_square_sum(prefix_sum, i, j, i + side_max - 1, j + side_max - 1)
  34.                 );
  35.             }
  36.         }
  37.  
  38.         return current_min;
  39.     }
  40.    
  41.     int get_square_sum(
  42.         const vector<vector<int>>& prefix_sum,
  43.         int row1, int col1, int row2, int col2
  44.     )
  45.     {
  46.         if (row2 >= prefix_sum.size() || col2 >= prefix_sum[0].size())
  47.             return numeric_limits<int>::max();
  48.        
  49.         int A = prefix_sum[row2][col2];
  50.         int B = col1 - 1 >= 0 ? prefix_sum[row2][col1 - 1] : 0;
  51.         int C = row1 - 1 >= 0 ? prefix_sum[row1 - 1][col2] : 0;
  52.         int D = row1 - 1 >= 0 && col1 - 1 >= 0 ? prefix_sum[row1-1][col1-1] : 0;
  53.        
  54.         int res = A - B - C + D;
  55.         return res;
  56.     }
  57.    
  58.     int maxSideLength(vector<vector<int>>& mat, int threshold) {
  59.         if (mat.size() == 0)
  60.             return 0;
  61.        
  62.         auto prefix_sum = get_prefix_sum(mat);
  63.  
  64.         int l = 0;
  65.         int r = max(mat.size(), mat[0].size()) + 1;
  66.        
  67.         while (r - l > 1)
  68.         {
  69.             int m = l + (r - l) / 2;
  70.             int sum = get_side_sum(m, prefix_sum, mat);
  71.             if (sum <= threshold)
  72.                 l = m;
  73.             else
  74.                 r = m;
  75.         }
  76.        
  77.         return l;
  78.     }
  79. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement