• "Coding Interview Guide" -- 在行列都排好序的矩阵中找数


    题目

      给定一个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(N+M),额外空间复杂度为O(1)

    my:

     1     public boolean isContains(int[][] matrix, int k)
     2     {
     3         if(matrix == null || matrix.length == 0 || matrix[0].length == 0)
     4         {
     5             return false;
     6         }
     7 
     8         int col = matrix[0].length - 1;
     9         for(int i = 0; i < matrix.length; i++)
    10         {
    11             if(matrix[i][col] >= k)
    12             {
    13                 for(int j = col; j > -1; j--)
    14                 {
    15                     if(matrix[i][j] == k)
    16                     {
    17                         return true;
    18                     }
    19                     else if(matrix[i][j] < k)
    20                     {
    21                         break;
    22                     }
    23                 }
    24             }
    25         }
    26         return false;
    27     }

     时间复杂度为O(N*M),空间复杂度为O(1),因为每一行每一列都是排好序的,所以如果遍历到某一行时发现其元素都比k大,说明k不在矩阵中,之后的所有行都不用访问了,因为当某一行的元素都比k大时,下面行的元素一定都比k大,所以如果在遍历的过程中某一行中的元素全部被遍历仍然没有找到k时,就可以判定结果了。

    左老师:

     1     public boolean isContains(int[][] matrix, int k)
     2     {    
     3         if(matrix == null || matrix.length == 0 || matrix[0].length == 0)
     4         {
     5             return false;
     6         }
     7 
     8         int row = 0;
     9         int col = matrix[0].length - 1;
    10         while(row < matrix.length && col > -1)
    11         {
    12             if(matrix[row][col] == k)
    13             {
    14                 return true;
    15             }
    16             else if(matrix[row][col] > k)
    17             {
    18                 col--;
    19             }
    20             else
    21             {
    22                 row++;
    23             }
    24         }
    25         return false;
    26     }

     时间复杂度为:O(N+M),空间复杂度为:O(1)

    来源:左程云老师《程序员代码面试指南》

  • 相关阅读:
    2019-2020-1 20199329《Linux内核原理与分析》第十二周作业
    2019-2020-1 20199329《Linux内核原理与分析》第十一周作业
    2019-2020-1 20199329《Linux内核原理与分析》第九周作业
    2019-2020-1 20199329《Linux内核原理与分析》第八周作业
    PHP基础学习笔记5
    MYSQL内置函数【转】
    PHP基础学习笔记3
    常用端口大全【转】
    NMAP输出结果中CPE的含义【转】
    探测主机信息
  • 原文地址:https://www.cnblogs.com/OoycyoO/p/10994818.html
Copyright © 2020-2023  润新知