【剑指offer】04. 二维数组中的查找

193 阅读1分钟

题目描述

在这里插入图片描述

// 04. 二维数组中的查找
// 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,
// 每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的
// 一个二维数组和一个整数,判断数组中是否含有该整数。
// 限制:

// 0 <= n <= 1000
// 0 <= m <= 1000

题解

// 时间复杂度 O(M + N): 18 ms
// 空间复杂度 O(1): 43.1 MB
// 从矩阵右上角开始遍历,则左边的数一定比右边的数小,
// 下边的数一定比上面的数大。
// 比较遍历数和target。
// 若遍历数大,target小,说明target在遍历数左边,遍历位置左移。
// 如果遍历数小,target大,说明target在遍历数下面,遍历位置下移
class Solution {
	public boolean findNumberIn2DArray(int[][] matrix, int target) {
		// 排除特殊情况
		if (matrix == null || matrix.length <= 0 || matrix[0].length <= 0) {
			return false;
		}
		// 取matrix的行和列
		int rows = matrix.length, cols = matrix[0].length;
		// 初始化遍历起始点索引,起始点为右上角
		int i = 0, j = cols-1;
		while (i <= rows-1 && j >= 0) {
			System.out.println(i + " " + j);
			if (matrix[i][j] == target) { return true;}
			if (matrix[i][j] < target) {
				i++;
			}
			// 防止之前i移动在先,造成越界,加一个i的不越界判定
			if (i <= rows-1 && matrix[i][j] > target) {
				j--;
			}
		}
		return false;
	}
}