Пары одинаковых строк и колонок

Средняя

Описание задачи #

Дана матрица grid размером n x n, которая состоит из целых положительных чисел.

Посчитайте количество пар (ri, cj), где строка ri равна колонке cj

Строка и колонка считаются равными, если они состоят из одинаковых элементов в одинаковом порядке.


Ограничения #


Примеры #

  • Пример 1

    Входные данные: grid = [[3,2,1],[1,7,6],[2,7,7]]

    Ответ: 1

    Есть одна одинаковая пара:

    • (Строка 2, Колонка 1): [2,7,7]
  • Пример 1

    Входные данные: grid = [[3,1,2,2],[1,4,4,5],[2,4,2,2],[2,4,2,2]]

    Ответ: 3

    Есть три одинаковые пары:

    • (Строка 0, Колонка 0): [3,1,2,2]
    • (Строка 2, Колонка 2): [2,4,2,2]
    • (Строка 3, Колонка 2): [2,4,2,2]

Решение #

Чтобы решить задачу, нам нужно определить количество пар строк и столбцов в матрице, которые совпадают. Для этого мы используем два прохода: один для строк и один для столбцов.

Создаем карту подсчета строк:

Подсчет совпадающих столбцов:

После прохода по всем столбцам возвращаем значение counter, которое будет равно количеству совпадающих пар строк и столбцов.

Реализация #

  • package main
    
    import (
    	"strconv"
    	"strings"
    )
    
    func equalPairs(grid [][]int) int {
    	countMap := make(map[string]int)
    	builder := strings.Builder{}
    	counter := 0
    
    	for _, row := range grid {
    		for _, col := range row {
    			builder.WriteString(strconv.Itoa(col))
    			builder.WriteString(";")
    		}
    
    		countMap[builder.String()]++
    		builder.Reset()
    	}
    
    	for j := 0; j < len(grid); j++ {
    		for i := 0; i < len(grid); i++ {
    			builder.WriteString(strconv.Itoa(grid[i][j]))
    			builder.WriteString(";")
    		}
    
    		counter += countMap[builder.String()]
    		builder.Reset()
    	}
    
    	return counter
    }

  • export const equalPairs = (grid: number[][]): number => {
        const countMap: Record<string, number> = {}
        let counter = 0
    
        grid.forEach(row => {
            let key = '';
    
            row.forEach(col => {
                key = `${key}${col};`
            })
    
            if (countMap[key]) {
                countMap[key]++
            } else {
                countMap[key] = 1
            }
        })
    
        for (let j = 0; j < grid.length; j++) {
            let key = '';
    
            for (let i = 0; i < grid.length; i++) {
                key = `${key}${grid[i][j]};`
            }
    
            if (countMap[key]) {
                counter += countMap[key]
            }
        }
    
        return counter
    }

Оценка сложности #

По времени

Решение имеет временную сложность O(n2), так как мы проходим по всей матрице дважды.

По памяти

Сложность по памяти равна O(n) так как мы создаем хеш-таблицу по количеству уникальных строк. В худшем случае размер этой таблицы будет равен n если все строки в матрице уникальны.

Оригинал задачи на Leetcode
< Предыдущая задача
Следующая задача >