74. Search a 2D Matrix
看起来是2d的问题,但是实际上依旧可以用一维二分的思想来做,无非就是计算横纵坐标而已。
下面用了开区间写法,闭区间写法也是okay的。
class Solution { public: bool searchMatrix(vector<vector<int>>& matrix, int target) { int m=matrix.size(), n=m==0?0:matrix[0].size(); if (m==0 || n==0) return false; int low=0, high=m*n; while (low<high){ int mid=(low+high)/2; int cur=matrix[mid/n][mid%n]; if (cur==target) return true; else if (cur<target) low=mid+1; else high=mid; } return false; } };
时间复杂度 O(log(mn))
240. Search a 2D Matrix II
如果沿用二分的思想,只能先纵向二分,再横向二分。如果没找到,继续两个方向二分。
时间复杂度 O(log(n!)),因为最坏情况要做n次二分。
Binary Search Tree Model
将左下角的元素当做类似BST的root。我们只要根据当前元素和target的关系移动,寻找target即可。
class Solution { public: bool searchMatrix(vector<vector<int>>& matrix, int target) { int m=matrix.size(), n=m==0?0:matrix[0].size(); if (m==0 || n==0) return false; int i=m-1, j=0; while (i>=0 && j<n){ if (matrix[i][j]==target) return true; else if (matrix[i][j]<target) ++j; else --i; } return false; } };
时间复杂度 O(m+n)
Divide and Conquer
To be continued ...