一、题目叙述及思路
1. 题目叙述
杨氏矩阵:
有一个二维数组,数组的每行从左到右是递增的,每列从上到下是递增的,在这样的数组中查找一个数字是否存在。
例如存在一个二维数组,每行每列都是递增的,查找一个数字是否存在:
1 2 3
4 5 6
7 8 9
2. 解题思路
假如我们要找的目标数target为5,有两种方法:
1.直接对该二维数组进行遍历,但该种方法时间复杂度为O(N^2),在此不考虑。
2.我们可以找到行列交界处,比如[0][2],即数字3这个位置,通过观察,我们可以发现,该数字是所处行中最大的,所处列中最小的,可以用目标数target和该交界处数字进行比较,如果target大于该数,则表示target比这行最大的数还要大,所以一定不在这一行,舍弃该行;如果target小于该数,则表示target比这列最小的数还要小,所以一定不在这一列,舍弃该列。以此类推,找到返回true,找不到返回false。
二、代码
class Solution {
public:
bool Find(int target, vector<vector<int>> array)
{
int i = 0;
int j = array[0].size() - 1;
while (i < array.size() && j >= 0)
{
if (target < array[i][j]) //array[i][j]一定是当前行最大、当前列最小的数
{
//target < array[i][j],排除当前列
j--;
}
else if (target > array[i][j])
{
//target > array[i][j],排除当前行
i++;
}
else
{
return true;
}
}
return false;
}
};