Рубрики
Без рубрики

Решение: поиск 2D Matrix II

Это является частью серии пояснений решения LeetCode (индекс). Если вам понравилось это решение или Фу … помечены алгоритмами, JavaScript, Java, Python.

Решения LeetCode (161 часть серии)

Это является частью серии объяснений решения LeetCode ( index ). Если вам понравилось это решение или нашел его полезным, Пожалуйста, как этот пост и/или УПОТАТЬ Мое решение пост на форумах LeetCode Отказ

Проблема летета № 240 (средний): поиск 2D Matrix II

Описание:

( Перейти к : Идея решения Код : JavaScript | Python |. Java |. C ++

Напишите эффективный алгоритм, который ищет цель Значение в м х н Целое число Матрица Отказ Матрица Имеет следующие свойства:

  • Целые числа в каждой строке сортируются в восходящем слева направо.
  • Целые числа в каждом столбце отсортированы в восходящемся части сверху вниз.

Примеры:

Вход: Матрица = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22], [10,13,14,17,24],[18,21,23,26,30]]
Выход: правда
Визуальный
Вход: Матрица = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22], [10,13,14,17,24],[18,21,23,26,30]]
Выход: ложный
Визуальный

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

  • m.length
  • n [I] .length
  • 1, М.
  • -10 ^ 9 [I] [J] ^ 9
  • Все целые числа в каждой строке отсортированы в порядке возрастания.
  • Все целые числа в каждом столбце отсортированы в порядке возрастания.
  • -10^9^9

Идея:

( Перейти к : Описание проблемы Код : JavaScript | Python |. Java |. C ++

Наивный подход здесь будет проверять каждую ячейку на Сложность времени O (m * n) Отказ Очевидное улучшение на это будет использовать бинарный поиск Но поскольку матрица ( m ) сортируется как по ряду, так и по столбцу, мы можем действительно думать о каждом клетка ( m [i] [j] ) как средняя точка в более длинной «строке», включая все клетки влево, а также ниже текущей ячейки.

Если мы начнем с верхнего правого угла М и обрабатывать это как модифицированный бинарный поиск, мы можем устранить целую строку или целый столбец каждый раз, когда мы проверяем клетка :

Затем нам просто нужно настроить наши Я или J Значение Чтобы перейти к верхней правой углу «средней точке» оставшейся матрицы каждый раз, чтобы сузить в нашей цели ( T ):

Это бросит временной сложность для O (m + n) Отказ

( Примечание: это работает так же, как и начиная с левого нижнего угла. )

Реализация:

Для всех, кроме Java, мы можем использовать побитовые не Оператор ( ~ ) проверить на граничное состояние J Потому что это вернет ложное значение ( 0 ) только когда J это -1 .

( Примечание. Некоторые люди достигают «быстрее» результатов, используя недостаток дизайна в тестируемом наборе. Похоже, что тест включает в себя один или несколько циклов одинакового матричного ввода, и люди имели идею очистить матрицу перед возвратом ответа, что облегчает обработку остальной части указанной циклы для обработки, поскольку мутированная матрица будет использоваться в последующие итерации теста. )

Код JavaScript:

( Перейти к : Описание проблемы Идея решения

var searchMatrix = function(M, T) {
    let y = M.length, i = 0, j = M[0].length - 1
    while (i < y && ~j) {
        let cell = M[i][j]
        if (cell === T) return true
        else if (cell > T) j--
        else i++
    }
    return false
};

Код Python:

( Перейти к : Описание проблемы Идея решения

class Solution:
    def searchMatrix(self, M: List[List[int]], T: int) -> bool:
        y, i, j = len(M), 0, len(M[0]) - 1
        while i < y and ~j:
            cell = M[i][j]
            if cell == T: return True
            elif cell > T: j -= 1
            else: i += 1
        return False

Java код:

( Перейти к : Описание проблемы Идея решения

class Solution {
    public boolean searchMatrix(int[][] M, int T) {
        int y = M.length, i = 0, j = M[0].length - 1;
        while (i < y && j >= 0) {
            int cell = M[i][j];
            if (cell == T) return true;
            else if (cell > T) j--;
            else i++;
        }
        return false;
    }
}

C ++ код:

( Перейти к : Описание проблемы Идея решения

class Solution {
public:
    bool searchMatrix(vector>& M, int T) {
        int y = M.size(), i = 0, j = M[0].size() - 1;
        while (i < y && ~j) {
            int cell = M[i][j];
            if (cell == T) return true;
            else if (cell > T) j--;
            else i++;
        }
        return false;
    }
};

Решения LeetCode (161 часть серии)

Оригинал: “https://dev.to/seanpgallivan/solution-search-a-2d-matrix-ii-4lc”