[Treinamento de novato] Oferta de dedo em espada 04. Pesquisa em uma matriz bidimensional (problema de pensamento médio)

Descrição do título:

Em uma matriz bidimensional n * m, cada linha é classificada em ordem crescente da esquerda para a direita e cada coluna é classificada em ordem crescente de cima para baixo. Conclua uma função eficiente, insira uma matriz bidimensional e um inteiro e julgue se a matriz contém o inteiro.

Exemplo:

A matriz existente é a seguinte:
[
[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]
]
Dado alvo = 5, retorna verdadeiro.
Dado alvo = 20, retorna falso.

limite:

0 <= n <= 1000

0 <= m <= 1000

Fonte: LeetCode (LeetCode)
Link: https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof
Copyright é propriedade da LeetCode . Para reimpressões comerciais, favor contatar a autorização oficial Para reimpressões não comerciais, favor indicar a fonte.

Ideias para resolução de problemas:

Essa pergunta é uma questão de pensamento e também pode ser considerada como uma forma de encontrar um padrão. Como a matriz é ordenada em cada linha e em cada coluna, o maior elemento na primeira coluna ou a primeira linha pode ser selecionado para julgamento e, em seguida, o maior elemento na primeira linha é selecionado para explicação.
Pegue o exemplo dado na pergunta acima para explicar, alvo = 5; primeiro, selecione 15 no canto superior direito para julgar com alvo. Obviamente, 15 é maior que 5, então é explicado aqui que a coluna de 15 é maior que 5 , e então ele pode ser ignorado, então cortamos o array 5 5 bidimensional em um array 5 4 bidimensional.

Repita a operação acima. Comparando 11 com o alvo, ainda é 11 grande, então a coluna de 11 é maior que 5. Se a coluna de 11 for excluída, a matriz é reduzida a uma matriz bidimensional de 5 a 3. Comparando 7 com o alvo, como acima, a matriz é reduzida a uma matriz bidimensional de 52 . Em seguida, 4 é menor que o alvo, 4 é menor que 5, então a linha de 4 não é considerada (não se esqueça de que nossa matriz foi reduzida a uma matriz bidimensional de 5 por 2), então reduzimos a matriz novamente para 4 Matriz bidimensional de 2. Executando essa operação novamente, encontramos o 5 na matriz, portanto, ele retorna verdadeiro.

** Nota: ** A exclusão da matriz aqui não é realmente uma exclusão, mas a parte da exclusão não é considerada, ou seja, definitivamente não há elemento igual ao destino, portanto não há necessidade de perder tempo comparar.

Ilustração:

Insira a descrição da imagem aqui

package com.lzw.test1;

/**
 * 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
 * 请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
 *
 * 示例:
 *
 * 现有矩阵 matrix 如下:
 *
 * [
 *   [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]
 * ]
 * 给定 target=5,返回true。
 *
 * 给定target=20,返回false。

 *
 * 限制:
 *
 * 0 <= n <= 1000
 *
 * 0 <= m <= 1000
 *
 * @author puppet
 * @create 2021-03-19-9:19
 */
public class jianzhi_Offer_04 {
    
    
    //从右上角开始
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
    
    
        boolean flag = false;
        if (matrix != null && matrix.length > 0 && matrix[0].length > 0){
    
    
            int row = matrix.length - 1;
            int col = matrix[0].length - 1;
            int n = row;
            int m = col;

            while (row >=0 && col >=0){
    
    
                if(matrix[n - row][col] == target){
    
    
                    flag = true;
                    break;
                }
                else if(matrix[n - row][col] < target){
    
    
                    row--;
                }
                else {
    
    
                    col--;
                }
            }
        }
        return flag;
    }

    //从左下角开始
    public boolean findNumberIn2DArray1(int[][] matrix, int target) {
    
    
        boolean flag = false;
        if (matrix != null && matrix.length > 0 && matrix[0].length > 0){
    
    
            int row = matrix.length - 1;
            int col = matrix[0].length - 1;
            int n = row;
            int m = col;

            while (row >=0 && col >= 0){
    
    
                if(matrix[row][m - col] == target){
    
    
                    flag = true;
                    break;
                }
                else if(matrix[row][m - col] < target){
    
    
                    col--;
                }
                else {
    
    
                    row--;
                }
            }
        }
        return flag;
    }

    public static void main(String[] args) {
    
    
        int[][] matrix = new int[][]{
    
    {
    
    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}};
        jianzhi_Offer_04 obj = new jianzhi_Offer_04();
        System.out.println(obj.findNumberIn2DArray1(matrix, 5));
    }
}

Acho que você gosta

Origin blog.csdn.net/Puppet__/article/details/115000588
Recomendado
Clasificación