← Static tasks

750. Number Of Corner Rectangles

leetcode medium

#array#csharp#leetcode#linked-list#matrix#medium#string#two-pointers

Task

Дан указатель на начало односвязного списка и два целых числа left и right, где left <= right. Необходимо перевернуть узлы списка, начиная с позиции left и заканчивая позицией right, и вернуть измененный список.

Пример:

Input: grid = [[1,0,0,1,0],[0,0,1,0,1],[0,0,0,1,0],[1,0,1,0,1]]

Output: 1

C# solution

matched/original
public class Solution {
    public int CountCornerRectangles(int[][] grid) {
        int count = 0;
        for (int i = 0; i < grid.Length; i++) {
            for (int j = i + 1; j < grid.Length; j++) {
                int numPairs = 0;
                for (int k = 0; k < grid[0].Length; k++) {
                    if (grid[i][k] == 1 && grid[j][k] == 1) {
                        numPairs++;
                    }
                }
                if (numPairs > 1) {
                    count += numPairs * (numPairs - 1) / 2;
                }
            }
        }
        return count;
    }
}

C++ solution

auto-draft, review before submit
#include <bits/stdc++.h>
using namespace std;

// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
    public int CountCornerRectangles(int[][] grid) {
        int count = 0;
        for (int i = 0; i < grid.size(); i++) {
            for (int j = i + 1; j < grid.size(); j++) {
                int numPairs = 0;
                for (int k = 0; k < grid[0].size(); k++) {
                    if (grid[i][k] == 1 && grid[j][k] == 1) {
                        numPairs++;
                    }
                }
                if (numPairs > 1) {
                    count += numPairs * (numPairs - 1) / 2;
                }
            }
        }
        return count;
    }
}

Java solution

matched/original
public class Solution {
    public int countCornerRectangles(int[][] grid) {
        int count = 0;
        for (int i = 0; i < grid.length; i++) {
            for (int j = i + 1; j < grid.length; j++) {
                int numPairs = 0;
                for (int k = 0; k < grid[0].length; k++) {
                    if (grid[i][k] == 1 && grid[j][k] == 1) {
                        numPairs++;
                    }
                }
                if (numPairs > 1) {
                    count += numPairs * (numPairs - 1) / 2;
                }
            }
        }
        return count;
    }
}

JavaScript solution

matched/original
var countCornerRectangles = function(grid) {
    let count = 0;
    for (let i = 0; i < grid.length; i++) {
        for (let j = i + 1; j < grid.length; j++) {
            let numPairs = 0;
            for (let k = 0; k < grid[0].length; k++) {
                if (grid[i][k] === 1 && grid[j][k] === 1) {
                    numPairs++;
                }
            }
            if (numPairs > 1) {
                count += numPairs * (numPairs - 1) / 2;
            }
        }
    }
    return count;
};

Python solution

matched/original
def countCornerRectangles(grid):
    count = 0
    for i in range(len(grid)):
        for j in range(i + 1, len(grid)):
            num_pairs = 0
            for k in range(len(grid[0])):
                if grid[i][k] == 1 and grid[j][k] == 1:
                    num_pairs += 1
            if num_pairs > 1:
                count += num_pairs * (num_pairs - 1) // 2
    return count

Go solution

matched/original
package main

func countCornerRectangles(grid [][]int) int {
    count := 0
    for i := 0; i < len(grid); i++ {
        for j := i + 1; j < len(grid); j++ {
            numPairs := 0
            for k := 0; k < len(grid[0]); k++ {
                if grid[i][k] == 1 && grid[j][k] == 1 {
                    numPairs++
                }
            }
            if numPairs > 1 {
                count += numPairs * (numPairs - 1) / 2
            }
        }
    }
    return count
}

Explanation

Algorithm

Пройдите по строкам матрицы. Для каждой пары строк, найдите все столбцы, где оба значения равны 1.

Подсчитайте количество таких столбцов. Если их больше одного, то они образуют прямоугольники.

Для каждой пары строк добавьте количество возможных прямоугольников в общий счетчик.

😎