Problem: 74. 搜索二维矩阵
文章目录
- 题目描述
- 思路
- 复杂度
- Code
题目描述
思路
思路1:映射为一维数组二分查找
1.由于题目矩阵中的元素整体是升序的,我们可以将其放置在一个大小为 m × n m \times n m×n的一维数组array中进行二分查找
2.对应的映射关系是array[mid] == mar[mid / n][mid % n]
思路2:直接在二维矩阵上进行二分查找
1.先对二维矩阵的第一列进行二分查找,找到小于等于target的一个数,讲此行标记为rowInd
2.从rowInd开始再进行二分查找
复杂度
思路1:
时间复杂度:
O ( l o g m n ) O(logmn) O(logmn)
空间复杂度:
O ( m n ) O(mn) O(mn)
思路2:
时间复杂度:
O ( l o g m n ) O(logmn) O(logmn)
空间复杂度:
O ( 1 ) O(1) O(1)
Code
思路1:
class Solution {
public:/*** Binary Search* * @param matrix Given array* @param target Given target number* @return bool*/bool searchMatrix(vector<vector<int>> &matrix, int target) {int row = matrix.size();if (row == 0) {return false;}int col = matrix[0].size();int left = 0;int right = row * col - 1;vector<int> array(row * col);while (left <= right) {int mid = left + (right - left) / 2;if (matrix[mid / col][mid % col] == target) {return true;} else if (matrix[mid / col][mid % col] > target) {right = mid - 1;} else if (matrix[mid / col][mid % col] < target) {left = mid + 1;}}return false;}
};
思路2:
class Solution {public:/*** Binary Search** @param matrix Given array* @param target Given target number* @return bool*/bool searchMatrix(vector<vector<int>>& matrix, int target) {int row = matrix.size();if (row == 0) {return false;}int col = matrix[0].size();int left = 0;int right = row - 1;while (left <= right) {int mid = left + (right - left) / 2;if (matrix[mid][0] == target) {return true;} else if (matrix[mid][0] > target) {right = mid - 1;} else if (matrix[mid][0] < target) {left = mid + 1;}}// Check out of boundsif (right < 0) {return false;}int rowIdx = right;left = 0;right = col - 1;while (left <= right) {int mid = left + (right - left) / 2;if (matrix[rowIdx][mid] == target) {return true;} else if (matrix[rowIdx][mid] > target) {right = mid - 1;} else if (matrix[rowIdx][mid] < target) {left = mid + 1;}}return false;}};