leetcode 750. Number Of Corner Rectangles

Given a grid where each entry is only 0 or 1, find the number of corner rectangles.

A corner rectangle is 4 distinct 1s on the grid that form an axis-aligned rectangle. Note that only the corners need to have the value 1. Also, all four 1s used must be distinct.

Example 1:
Input: grid = 
[[1, 0, 0, 1, 0],
 [0, 0, 1, 0, 1],
 [0, 0, 0, 1, 0],
 [1, 0, 1, 0, 1]]
Output: 1
Explanation: There is only one corner rectangle, with corners grid[1][2], grid[1][4], grid[3][2], grid[3][4].
Example 2:
Input: grid = 
[[1, 1, 1],
 [1, 1, 1],
 [1, 1, 1]]
Output: 9
Explanation: There are four 2x2 rectangles, four 2x3 and 3x2 rectangles, and one 3x3 rectangle.
Example 3:
Input: grid = 
[[1, 1, 1, 1]]
Output: 0
Explanation: Rectangles must have four distinct corners.
Note:
The number of rows and columns of grid will each be in the range [1, 200].
Each grid[i][j] will be either 0 or 1.
The number of 1s in the grid will be at most 6000.
Discuss

暴力枚举+轻微减枝

class Solution {
public:
    int search(vector<vector<int>>& grid, int x, int y) {
        int n = grid.size();
        int m = grid[0].size();
        int cnt = 0;
        for (int i = 1; i < n - x; ++i) {
            if(grid[x+i][y] == 0) continue;
            for (int j = 1; j < m - y; ++j) {
                int x1, y1;
                
                x1 = x;
                y1 = y + j;
                if (grid[x1][y1] == 0) continue;
                
                x1 = x + i;
                y1 = y + j;
                if (grid[x1][y1] == 0) continue;

                x1 = x + i;
                y1 = y;
                if (grid[x1][y1] == 0) continue;
                cnt++;
            }
        }
        return cnt;
    }
    int countCornerRectangles(vector<vector<int>>& grid) {
        int n = grid.size();
        int m = grid[0].size();
        if (n == 1) return 0;
        int ans = 0;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < m; ++j) {
                if (grid[i][j] == 1) {
                    ans += search(grid, i, j);
                }
            }
        }
        return ans;
    }
};
原文地址:https://www.cnblogs.com/pk28/p/8051920.html