zoukankan      html  css  js  c++  java
  • 数组和矩阵问题:在行列都排好序的矩阵中找数

    题目

      给定一个有 N*M 的整型矩阵 matrix 和一个整数 K,matrix 的每一行和每一列都是排好序的。实现一个函数,判断 K 是否在 matrix 中。

      例如:

      0  1  2  5

      2  3  4  7

      4  4  4  8

      5  7  7  9

      如果 K 为 7,返回 true; 如果 K 为 6,返回 false。

    要求

      时间复杂度为 O(M+N), 额外空间复杂度为 O(1)。

    难度

      一星

    解答

      注意到该矩阵行列都是排好序的,可以从右上角或者左下角开始与K进行比较。

      下面说明从右上角的数开始寻找的方法:

      1. 从矩阵右上角的数开始寻找(row=0, col=M-1),注意到 matrix[row][col] 左边的数都小于等于 matrix[row][col],下边的数都大于等于 matrix[row][col]。

      2. 比较当前数 matrix[row][col] 与 K 的关系:

    • 如果与 K 相等,说明已被找到,直接返回 true;
    • 如果大于 K,说明 K 有可能在 matrix[row][col] 的左边,令 col = col-1, 重复步骤2;
    • 如果小于 K,说明 K 有可能在 matrix[row][col] 的下边,令 row = row+1,重复步骤2;

      3. 如果找到越界都没有发现与 K 相等的数,则返回 false.

     1 public class Main {
     2     public static void main(String[] args) {
     3         int[][] matrix = {{0,1,2,5},{2,3,4,7},{4,4,4,8},{5,7,7,9}};
     4         System.out.println(new Main().isContains(matrix, 7)); //true
     5         System.out.println(new Main().isContains(matrix, 6)); //false
     6     }
     7     
     8     public boolean isContains(int[][] matrix, int K){
     9         //从右上角的数开始与 K 进行比较
    10         int row = 0;
    11         int col = matrix[0].length - 1;
    12         while(row < matrix.length && col > -1){
    13             if(matrix[row][col] == K){ //若找到与 K相等的数直接返回 true
    14                 return true;
    15             }else if(matrix[row][col] > K){ //若大于K, 则K有可能在 matrix[row][col] 的左边
    16                 col--;
    17             }else{ //若大于K, 则K有可能在 matrix[row][col] 的下边
    18                 row++;
    19             }
    20         }
    21         return false;
    22     }
    23 }

       从左下角的数(row=N-1, col=0)开始寻找的方法与上述类似,注意到 matrix[row][col] 上边的数都小于等于 matrix[row][col],右边的数都大于等于 matrix[row][col]。具体代码可自行实现。

      

  • 相关阅读:
    【leetcode】1442. Count Triplets That Can Form Two Arrays of Equal XOR
    【leetcode】1441. Build an Array With Stack Operations
    【leetcode】1437. Check If All 1's Are at Least Length K Places Away
    cxCheckCombobox
    修改现有字段默认值
    2018.01.02 exprottoexcel
    Statusbar OwnerDraw
    dxComponentPrinter记录
    单据暂存操作思路整理
    设置模式9(装饰者,责任链,桥接,访问者)
  • 原文地址:https://www.cnblogs.com/zlxyt/p/10522238.html
Copyright © 2011-2022 走看看