问题:矩阵从左至右、从上至下非递减 顺序,查找target是否在数组中剑指 Offer 04. 二维数组中的查找 - 力扣(LeetCode)
方法一:标志数flag:选择左下角或者右上角为标志数;
选择左下角为flag:若flag > target,则target在flag所在行的上方,那么此行向前递减;若flag < target,则target在flag所在列的右方,那么此列进行递增;
时间复杂度:O(M+N);空间复杂度:O(1);
class Solution { public: bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) { int i = matrix.size()-1, j =0; while(i >= 0 && j < matrix[0].size()){ if(matrix[i][j] > target) --i; else if(matrix[i][j] < target) ++j; else return true; } return false; } };
方法二:二分查找
标准库中的 lower_bound(first,last,target) 函数,对每一行进行一次二分查找;返回不小于等于target的迭代器
该函数要求范围内的数有序,至少针对target已经进行了划分。
class Solution { public: bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) { for(const auto& row : matrix){ auto it = lower_bound(row.begin(),row.end(),target); if(it != row.end() && *it == target){ return true; } } return false; } };
标签:return,target,flag,二维,查找,数组,row,matrix From: https://www.cnblogs.com/xuan01/p/17119145.html