• 750. Number Of Corner Rectangles


    问题描述:

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

    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:

    1. The number of rows and columns of grid will each be in the range [1, 200].
    2. Each grid[i][j] will be either 0 or 1.
    3. The number of 1s in the grid will be at most 6000.

    解题思路:

    一开始想到的是暴力破解法:即对每一个点进行检查以它为左上角的矩形的个数。

    先向下走,再向右走,最后再向上走,复杂度我认为是O(n4)

    看到了别人提交的较快的方法,实际上是进行了剪枝,因为若能构成矩形,必定有另一个顶点在同一行。

    我们记录改顶点往后的为1的 j 值,对后面的每一行检查对应的两个顶点的值是否为1

    代码:

    class Solution {
    public:
        int countCornerRectangles(vector<vector<int>>& grid) {
            if(grid.size() <= 1 || grid[0].size() <= 1)
                return 0;
            int ret = 0;
            for(int i = 0; i < grid.size() - 1; i++){
                for(int j = 0; j < grid[0].size() - 1; j++){
                    if(grid[i][j] == 1)
                        ret += findRec(grid, i, j);
                }
            }
            return ret;
        }
        
        int findRec(vector<vector<int>> &grid, int i, int j){
            int ret = 0;
            for(int x = i+1; x < grid.size(); x++){
                if(grid[x][j] == 1){
                    for(int y = j+1; y < grid[0].size(); y++){
                        if(grid[x][y] == 1 && grid[i][y] == 1)
                            ret++;
                    }
                }
            }
            return ret;
        }
    };

    较快的方法:

    classclass  SolutionSolution { {
     publicpublic:
        :     intint  countCornerRectanglescountCornerRectangles((vectorvector<<vectorvector<<intint>>& grid)>>& grid)  {
            {         ifif(grid.empty() || grid[(grid.empty() || grid[00].empty()){
                ].empty()){             return 0;
            }
            int res = 0;
            int row = grid.size(), col = grid[0].size();
            for(int i = 0; i < row-1; i++){
                vector<int> ones;
                for(int j = 0; j < col; j++){
                    if(grid[i][j] == 1){
                        ones.push_back(j);
                    }
                }
                for(int k = i+1; k < row; k++){
                    int cur = 0;
                    for(auto o:ones){
                        if(grid[k][o] == 1){
                            cur++;
                        }
                    }
                    res += cur*(cur-1)/2;
                }
            }
            return res;
        }
    };
  • 相关阅读:
    Notes相关开发Tips
    gridView滚动条相关问题
    MyBatis学习(一)简单入门程序
    springMVC入门
    zoj 3702 Gibonacci number 找规律
    邻接表表示
    poj 1269 直线相交情况
    poj 3304 Segments 线段与直线相交的判断
    poj 1654 多边形面积
    zoj 3696 Alien's Organ 概率,泊松分布
  • 原文地址:https://www.cnblogs.com/yaoyudadudu/p/9286944.html
Copyright © 2020-2023  润新知