"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)

 

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

 

posted @ 2019-06-09 21:04  Latuper  阅读(202)  评论(0编辑  收藏  举报