750. Number Of Corner Rectangles

Medium
这个题觉得真的智商不行,室友说的方法真的蛮巧妙的.
我的思路就很狭窄,一直在想什么找到四个角,wtf…it hardly works.
室友的写法是找到竖条,然后n个竖条可以组成n * (n – 1) / 2个长方形,这个竖条就是长方形的长(或者宽,不知道具体怎么定义).
一开始是建立一个list of list of integer, 来装每一行里面有1的那些点的列index. 然后遍历时通过find来找每两行里相同列有1的数目,也就是竖条数目。这个find函数满巧妙的,从index1 = 0, index2 = 0开始,如果list1.get(index1) == list2.get(index2),说明两行在同一列上都有1,那么就是一条竖线。 这样子找到竖线数目,就能找到这两行能组成的长方形个数,这个规律是长方形个数 = n*(n – 1) / 2.

class Solution {
    public int countCornerRectangles(int[][] grid) {
        List<List<Integer>> lists = new ArrayList<>();
        for(int i = 0; i < grid.length; i++){
            lists.add(new ArrayList<Integer>());
            for (int j = 0; j < grid[0].length; j++){
                if (grid[i][j] == 1){
                    lists.get(i).add(j);
                }
            }
        }
        int res = 0;
        for (int i = 0; i < grid.length; i++){
            List<Integer> list1 = lists.get(i);
            for (int j = i + 1; j < grid.length; j++){
                List<Integer> list2 = lists.get(j);
                res += find(list1, list2);
            }
        }
        return res;   
    }
    
    private int find(List<Integer> l1, List<Integer> l2){
        int index1 = 0;
        int index2 = 0;
        int sameVertical = 0;
        while (index1 < l1.size() && index2 < l2.size()){
            if (l1.get(index1) < l2.get(index2)){
                index1++;
            } else if (l1.get(index1) > l2.get(index2)){
                index2++;
            } else {
                index1++;
                index2++;
                sameVertical++;
            }
        }
        return sameVertical * (sameVertical - 1) / 2;
    }
}
    原文作者:greatfulltime
    原文地址: https://www.jianshu.com/p/825b5100a9e1
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞