算法名称:二维数组中的查找
题目内容:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路:
首先选取数组中右上角的数字。如果该数字等于要查找的数字,查找过程结束;如果该数字大于要查找的数字,剔除这个数字所在的列;如果该数字小于要查找的数字,剔除这个数字所在的行。也就是说如果要查找的数字不在数组的右上角,则每一次都在数组的查找范围中剔除一行或者一列,这样每一步都可以缩小查找的范围,直到找到要查找的数字,或者查找范围为空。
例如,我们要在上述的二维数组中查找数字7的步骤如下图所示:
实例代码:
- Java
class Solution {public boolean findNumberIn2DArray(int[][] matrix, int target) {if (matrix.length > 0 && matrix[0].length > 0) {int row = 0;int colomn = matrix[0].length - 1;while (row < matrix.length && colomn >= 0) {if (target < matrix[row][colomn]) {colomn--;} else if (target > matrix[row][colomn]) {row++;} else if (target == matrix[row][colomn]) {return true;}}}return false;}}
- Golang版
func findNumberIn2DArray(matrix [][]int, target int) bool {if len(matrix) > 0 && len(matrix[0]) > 0 {row := 0colomn := len(matrix[0]) - 1for row < len(matrix) && colomn >= 0 {if target < matrix[row][colomn] {colomn--} else if target > matrix[row][colomn] {row++} else if target == matrix[row][colomn] {return true}}}return false}
本题考点:
- 考察面试者对二维数组的理解及编程能力。二维数组在内存中占据连续的空间。在内存中从上到下存储各行元素,在同一行中按照从左到右的顺序存储。因此我们可以根据行号和列号计算出相对于数组首地址的偏移量,从而找到对应的元素。