二分搜索变形
本来是一道很普通的水题,但是水出了质量。
一个矩阵元素满足,左->右 and 上->下 递增,问是否含有target数值。
暴力搜索(python):

class Solution: def searchMatrix(self, matrix: list[list[int]], target: int) -> bool: for i in matrix: if target in i: return True return False
然后想了个进阶一点的,迭代类型的dfs:
简单分析了以下数据分布:
从右上开始寻找一个元素,优先右移搜索,直到元素 >or= target
然后下移搜索,直到元素 >or= target
如果右and下都有>target,那么左移同时处理当前点(防止死循环)
出循环后,检测x,y下标范围和元素是否等于target

class Solution { int m, n; bool ck(int x, int y) { return 0 <= x && x < m && 0 <= y && y < n; } public: bool searchMatrix(vector<vector<int>> &matrix, int target) { m = matrix.size(), n = matrix[0].size(); int x = 0, y = 0; while (ck(x, y) && matrix[x][y] != target) { //优先左移 if (ck(x, y + 1) && matrix[x][y + 1] <= target) ++y; else if (ck(x + 1, y) && matrix[x + 1][y] <= target) ++x; else matrix[x][y] = target + 1, --y; } return ck(x, y) && matrix[x][y] == target; } };
再进阶一点的,
利用二分搜索了,很巧妙的是从右上角(左下角也行)开始搜索,
思维很简单,如果二分的mid处理,然后就是左移或者下移直到找到or出界

class Solution { public: bool searchMatrix(vector<vector<int>> &matrix, int target) { int m = matrix.size(), n = matrix[0].size(); int x = 0, y = n - 1; while (x < m && 0 <= y) { if (matrix[x][y] == target) return true; matrix[x][y] < target ? ++x : --y; } return false; } };
【刚看到这个题的时候,如果我用二分搜索的话,我更可能会直接转存为一维数组然后find了】
【Over】
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!