二维数组中的查找:
题目链接:
题目描述:
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
Consider the following matrix:
[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]
Given target = 5
, return true
。
Given target = 20
, return false
。
解题思路:
利用该二维数组的性质:
• 每一行都按照从左到右递增的顺序排序,
• 每一列都按照从上到下递增的顺序排序
该二维数组中的一个数,小于它的数一定在其左边,大于它的数一定在其下边。因此,从右上角开始查找,就可以根据 target 和当前元素的大小关系来缩小查找区间,当前元素的查找区间为左下角的所有元素。
• 当 m < target,由于 m 已经是该行最大的元素,想要更大只有从列考虑,取值右移一位
• 当 m > target,由于 m 已经是该列最小的元素,想要更小只有从行考虑,取值上移一位
• 当 m = target,找到该值,返回 true
用某行最小或某列最大与 target 比较,每次可剔除一整行或一整列。

复杂度:
时间复杂度:O(行高+列宽)
空间复杂度:O(1)
代码实现:
public class Solution {
public boolean Find(int target, int [][] array) {
int i = array.length - 1;
int j = 0;
int value = target;
while (i >= 0 && j < array[0].length){
if (array[i][j] < value){
j++;
}else if (array[i][j] > value){
i--;
}else {
return true;
}
}
return false;
}
}
Peace!