目录
题目描述:
题目要求:
在一个 n * m 的二维数组中,每一行都按照从左到右 非递减 的顺序排序,每一列都按照从上到下 非递减 的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
示例:
解题思路:
方法:
根据条件中“从上到下递增,从左到右递增”的特点,我们可以先定义行 row 和列 col ,让其起点位于整个二维数组的右上角的元素,即位于 matrix[0][matrix.size()-1] 的位置,则有:
- 若:matirix[row][col] > target,那么 target 一定在 matirix[row][col] 行的下方;
- 若:matirix[row][col] < target,那么 target 一定在 matirix[row][col] 列的左方。
(左下角开始与右上角开始同理,仅是大小判断与移动方向不同)
图解:
示例:
步骤:
具体操作:
- 首先如果 matrix.size() == 0,直接返回 false;
- 定义起始位置右上角(或是左下角,此处以右上角为例);
//第一行最后一列: int row=0; //行 int col=matrix[0].size()-1; //列 //此时 matrix[row][col] 等价于 15
- 此时进入一个 while 循环,在其中判断 matrix[row][col] 与 targrt 的大小关系,并进行移动,同时判断。
while(row<matrix.size() && col>=0 ){//因为此时位置是在第行最后一列,行只能向下移动,列只能向左移动 //如果 等于,直接返回 true if(matrix[row][col] == target) return true; //大于 target,则列-- else if(matrix[row][col] > target) col--; //小于 target,则行++ else if(matrix[row][col] < target) row++; }
复杂度分析:
- 时间复杂度 O(M+N):其中,M 和 N 分别为矩阵行数和列数,此算法最多循环 M+N 次。
- 空间复杂度 O(1):row ,col 指针使用常数大小额外空间。
具体代码:
class Solution {
public:
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
if(matrix.size()==0)return 0;//判断数组是否为0
//利用数组特点
int row=0;//行:第一行开始
int col=matrix[0].size()-1;//列:最后一列开始
while(row<matrix.size()&&col>=0){
//如果直接相等,直接返回true
if(matrix[row][col]==target)return true;
else if(matrix[row][col]>target){
col--;//target<数,则列--
}
else if(matrix[row][col]<target){
row++;//target>数,则行++
}
//两个 else if 可简化为:
//matrix[row][col]>target?col--:row++;
}
return false;
}
};