[leetcode] 240 Search a 2D Matrix II
非常经典的一道题,每行由左到右。每列由上到下升序排列。让我们採用高效的算法推断一个值是不是存在。
第一种方案:遍历行。若发现行首的元素<=target<=行尾的元素,则对该行进行二分查找。
这种时间复杂度是O(n+m)。
第一种方案:遍历行。若发现行首的元素<=target<=行尾的元素,则对该行进行二分查找。
这个算法的最坏时间复杂度是O(n*logm)。当然假设你对行也进行二分搜索,确定一个搜索的行的范围的话,时间复杂度会更低。
class Solution { public: bool searchMatrix(vector<vector<int> >& matrix, int target) { int n=matrix.size(),m=matrix[0].size(); for(int i=0;i<n;i++) { if(matrix[i][0]<=target&&matrix[i][m-1]>=target) { int left=0,right=m-1; while(left<=right) { int mid=(left+right)/2; if(matrix[i][mid]==target) return true; else if(matrix[i][mid]>target) right=mid-1; else left=mid+1; } } } return false; } };另外一种方案:非常巧妙的一个答案,我也是看了网上的题解才发现这样的静止的算法。算法主要是依据矩阵的特点得来的。假设我们从矩阵的右上角開始,假设target>cur时,那么行数当前行排除,行数+1;假设target<cur时。那么当前列排除。列数-1.遇到边界则结束,返回false;
这种时间复杂度是O(n+m)。
要优于第一种算法。
class Solution { public: bool searchMatrix(vector<vector<int> >& matrix, int target) { int n=matrix.size(),m=matrix[0].size(); int i=0,j=m-1; while(i<n&&j>=0) { if(matrix[i][j]==target) return true; else if(matrix[i][j]<target) i++; else j--; } return false; } };
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步