LeetCode 74. Search a 2D Matrix

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:

Integers in each row are sorted from left to right.
The first integer of each row is greater than the last integer of the previous row.
Example 1:

Input:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 3
Output: true
Example 2:

Input:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 13
Output: false
解析:
给定一个m*n的矩阵,矩阵中的每一行的数值从左到右是已经排好序的,并且后一行第一个数值要大于前一行最后一个。给定目标值实现快速查找。
解法1:
因为矩阵是已经排好序的,即按行和按列都是已经排好序的,所以可以先确定目标值所在的行,然后在该行中进行二分查找。
代码如下:
[cc lang=”C++”]
class Solution {
public:
bool searchMatrix(vector>& matrix, int target) {
int row_len = matrix.size();
if(row_len == 0)
return false;
int col_len = matrix[0].size();
if(col_len == 0)
return false;
int row_index = 0;
while(row_index < row_len && target > matrix[row_index][col_len-1])
{
row_index ++;
}
if(row_index >= row_len)
return false;
int low = 0, high = matrix[row_index].size();
while(low <= high) { int mid = low + (high-low)/2; if(matrix[row_index][mid] == target) return true; else if(matrix[row_index][mid] > target)
high = mid -1;
else
low = mid + 1;
}
return false;
}
};
[/cc]
运行结果:

解法2:
其实整个矩阵可以认为是一个已经排好序的列表,对整个列表进行二分查找。对于m*n的矩阵,low=0,high = m*n-1;mid对应于矩阵的行列下标分别是:row_index = mid / n, col_index = mid %n;
具体代码如下:
[cc lang=”C++”]
class Solution {
public:
bool searchMatrix(vector>& matrix, int target) {
int m = matrix.size();
if (m == 0)
return false;
int n = matrix[0].size();
if (n==0)
return false;
int len = m*n;
int low = 0, high = len-1;
while(low <= high) { int mid = low + (high-low)/2; int row_index = mid / n; int col_index = mid % n; if(target == matrix[row_index][col_index]) return true; else if(target > matrix[row_index][col_index])
low = mid +1;
else
high = mid -1;
}
return false;
}
};
[/cc]

One Comment

Add a Comment

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据