"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)
来源:左程云老师《程序员代码面试指南》