前排重要说明:本算法面试刷题系列笔记的题目以及解析来自于 左程云 老师的著作《程序员代码面试指南》,这里对每道题加上点自己的理解,只作为刷题笔记温故而知新。感谢左老师!
在行列都排好序的矩阵中找到指定数
题目
给定一个 整形矩阵matrix和一个整数K,matrix的每一行和每一列都是排好序的。
实现一个函数,判断K是否在matrix中。
例如:
如果K为6则返回true,如果K为10则返回false。
解析
matrix每一行和每一列都是排好序的,在循环对比数据是否在矩阵(二维数组)中的时候,可以从矩阵的右上角或者左下角进行循环。
如果从 右上角 开始循环(行row,列col),寻找整体趋势是 往矩阵的左下方去寻找 ,步骤如下:
- 令 row = 0,col = M - 1;
- 比较当前矩阵数值 与给定的 值的大小关系:
- 如果 ,则K在矩阵中,直接返回true;
- 如果 ,因为矩阵的每一列都是排好序的,因此 列上当前值的下方的值均比 大,也就没必要继续寻找该列了,只需要另 (往左寻找),重复该步骤2 ;
- 如果 ,因为矩阵的每一行都是排好序的,因此 行上当前值的左方的值均比 大,也就没必要继续寻找该行了,只需要另 (往下寻找),重复该步骤2 。
- 当找到越界都没有找到与 相等的数,说明矩阵中没有给定的数,直接返回false。
如果从 左下角 开始循环(行row,列col),寻找K值的整体趋势则变成了 往矩阵的右上方去寻找 ,步骤如下:
- 令 row = N - 1,col = 0;
- 比较当前矩阵数值 与给定的 值的大小关系:
- 如果 ,则K在矩阵中,直接返回true;
- 如果 ,因为矩阵的每一行都是排好序的,因此 行上当前值的右方的值均比 大,也就没必要继续寻找该行了,只需要另 (往上寻找),重复该步骤2 ;
- 如果 ,因为矩阵的每一列都是排好序的,因此 列上当前值的上方的值均比 小,也就没必要继续往上寻找该行了,只需要另 (往右寻找),重复该步骤2 。
- 当找到越界都没有找到与 相等的数,说明矩阵中没有给定的数,直接返回false。
代码实现
public class FindNumInSortedMatrix {
public boolean contains(int[][] matrix, int k) {
//第一步,另 row=0,col=matrix[0].length-1
int row = 0;
int col = matrix[0].length - 1;
while (row < matrix.lenth && col > -1) {
if (matrix[row][col] == k) {
return true;
} else if (matrix[row][col] > k) {
col--;
} else {
row++;
}
}
return false;
}
}
小结
画图分析好循环查找matrix的值的整体走向,是向左向右还是向上向下循环,来确定row/col的增减。