题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路
- 我记得在leetcode上也有这么一道题“240. 搜索二维矩阵 II”,最开始用了暴力搜索发现超时,最后我写了一个将数组分为两半查找过了。
- 二维数组是有序的,从右上角来看,向左数字递减,向下数字递增。
因此从右上角开始查找,- 当要查找数字比右上角数字大时,下移;
- 当要查找数字比右上角数字小时,左移;
- 如果出了边界,则说明二维数组中不存在该整数。
最优算法图解
参考代码:
package offer;
/**
* 二维数组查找 左到右变大 上到下变大 找右上角 小与列则删一列大于列则删一行
*/
public class Offer4 {
/*
* 1 2 8 9
* 2 4 9 12
* 4 7 10 13
* 6 8 11 15
*/
public static void main(String[] args) {
int array[][] = new int[4][4];
array[0][0] = 1;
array[0][1] = 2;
array[0][2] = 8;
array[0][3] = 9;
array[1][0] = 2;
array[1][1] = 4;
array[1][2] = 9;
array[1][3] = 12;
array[2][0] = 4;
array[2][1] = 7;
array[2][2] = 10;
array[2][3] = 13;
array[3][0] = 6;
array[3][1] = 8;
array[3][2] = 11;
array[3][3] = 15;
System.out.println(find(array, 7));
System.out.println(find(array, 5));
}
private static boolean find(int[][] arr, int keyNumber) {
if (arr.length == 0) {
} else {
int column = arr[0].length - 1; // 列 最右的那列
int row = 0; // 行
while (column >= 0 && row < arr.length) {
if (arr[row][column] == keyNumber) {
return true;
} else if (arr[row][column] > keyNumber) {
column--;
} else {
row++;
}
}
}
return false;
}
}
领口上侥幸通过的写法!????
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
for (int i = 0; i < matrix.length / 2; i++) { // 行
for (int j = 0; j < matrix[i].length; j++) { // 列
if (target == matrix[i][j])
return true;
}
}
for (int i = matrix.length-1; i >= matrix.length / 2; i--) { // 行
for (int j = 0; j < matrix[i].length; j++) { // 列
if (target == matrix[i][j])
return true;
}
}
return false;
}
}
附录
该题源码在我的 ????Github 上面!