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;
}
}