【算法面试刷题】NO 1 在行列都排好序的矩阵中找到指定数

73 阅读3分钟

前排重要说明:本算法面试刷题系列笔记的题目以及解析来自于 左程云 老师的著作《程序员代码面试指南》,这里对每道题加上点自己的理解,只作为刷题笔记温故而知新。感谢左老师!

代码仓库:github.com/xblzer/algo…

在行列都排好序的矩阵中找到指定数

题目

给定一个 N×MN × M 整形矩阵matrix和一个整数K,matrix的每一行和每一列都是排好序的。

实现一个函数,判断K是否在matrix中。

例如:

如果K为6则返回true,如果K为10则返回false。

解析

matrix每一行和每一列都是排好序的,在循环对比数据是否在矩阵(二维数组)中的时候,可以从矩阵的右上角或者左下角进行循环。

如果从 右上角 开始循环(行row,列col),寻找整体趋势是 往矩阵的左下方去寻找 ,步骤如下:

  1. 令 row = 0,col = M - 1;
  2. 比较当前矩阵数值 matrix[row][col]matrix[row][col] 与给定的 KK 值的大小关系:
    • 如果 matrix[row][col]=Kmatrix[row][col] = K ,则K在矩阵中,直接返回true;
    • 如果 matrix[row][col]>Kmatrix[row][col] > K ,因为矩阵的每一列都是排好序的,因此 colcol 列上当前值的下方的值均比 KK 大,也就没必要继续寻找该列了,只需要另 col=col1col = col - 1 (往左寻找),重复该步骤2
    • 如果 matrix[row][col]<Kmatrix[row][col] < K ,因为矩阵的每一行都是排好序的,因此 rowrow 行上当前值的左方的值均比 KK 大,也就没必要继续寻找该行了,只需要另 row=row+1row = row + 1 (往下寻找),重复该步骤2
  3. 当找到越界都没有找到与 KK 相等的数,说明矩阵中没有给定的数,直接返回false。

如果从 左下角 开始循环(行row,列col),寻找K值的整体趋势则变成了 往矩阵的右上方去寻找 ,步骤如下:

  1. 令 row = N - 1,col = 0;
  2. 比较当前矩阵数值 matrix[row][col]matrix[row][col] 与给定的 KK 值的大小关系:
    • 如果 matrix[row][col]=Kmatrix[row][col] = K ,则K在矩阵中,直接返回true;
    • 如果 matrix[row][col]>Kmatrix[row][col] > K ,因为矩阵的每一行都是排好序的,因此 rowrow 行上当前值的右方的值均比 KK 大,也就没必要继续寻找该行了,只需要另 row=row1row= row - 1 (往上寻找),重复该步骤2
    • 如果 matrix[row][col]<Kmatrix[row][col] < K ,因为矩阵的每一列都是排好序的,因此 colcol 列上当前值的上方的值均比 KK 小,也就没必要继续往上寻找该行了,只需要另 col=col+1col= col+ 1 (往右寻找),重复该步骤2
  3. 当找到越界都没有找到与 KK 相等的数,说明矩阵中没有给定的数,直接返回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的增减。