二维数组中的查找
2023-04-18 15:21:57 时间
问题:矩阵从左至右、从上至下非递减 顺序,查找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; } };
相关文章
- 自己动手开发编译器(一)编译器的模块化工程
- 分享8年开发经验,浅谈个人发展经历,明确自己发展方向
- Microsoft NLayerApp案例理论与实践 - 领域模型层
- 自己动手开发编译器(零)序言
- iPhone消息推送机制实现与探讨
- Entity Framework快速入门--直接修改(简要介绍ObjectContext处理机制)
- Microsoft NLayerApp案例理论与实践 - 基础结构层(Cross-Cutting部分)
- WorkFlow入门Step.1—My Frist WorkFlow Trip!
- 程序员应知——善于借鉴
- 原来是这样:C#中字符串的内存分配与驻留池
- 面试时,你会问面试官哪些问题?
- 深入浅出多线程系列之五:一些同步构造(上篇)
- gmail loading progress bar 实现原理
- 深入浅出多线程系列之三:线程池
- 2.6.39发布了-最近关于内核开发的一些感受
- 码斗士的修炼之路 -- 如何保持并提升战斗力
- 初识函数式编程和Lisp之后的一点感想
- Scrum之成败——从自身案例说起,仅供参考
- 新浪,腾迅,网易微博OAuth统一认证接口实现
- 我为什么拒绝写注释