思路:这题二维矩阵少了Leetcode中的一个限制,就是这一行的最左边的值并一定比前一行的最右边的值大。我们同样也是先找到所在行,然后在该行二分查找,但是定位所在行的方式需要改变。
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
bool SearchMatrix(vector<vector<int> > &matrix, int target) {
if(matrix.empty() || matrix[0].empty()) return false;
int row = -1;
{
int l = 0, r = matrix.size() - 1;
while(l <= r)
{
int mid = l + (r - l) / 2;
if(target < matrix[mid].back())
r = mid - 1;
else if(target > matrix[mid].back())
l = mid + 1;
else
return true;
}
row = l;
}
if(row == matrix.size()) return false;
int l = 0, r = matrix[0].size() - 1;
while(l <= r)
{
int mid = l + (r - l) / 2;
if(target < matrix[row][mid])
r = mid - 1;
else if(target > matrix[row][mid])
l = mid + 1;
else
return true;
}
return false;
}
int main()
{
int m, n, target;
while(cin>>m>>n>>target)
{
vector<vector<int> > matrix(m, vector<int>(n));
for(int i = 0; i < m; ++i)
for(int j = 0; j < n; ++j)
scanf("%d", &matrix[i][j]);
if(SearchMatrix(matrix, target))
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
有种思路比较简单的方法,从矩阵的右上角开始,根据比较结果,要么往下一行,要么往左一列。
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
bool SearchMatrix(vector<vector<int> > &matrix, int target) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(matrix.empty() || matrix[0].empty()) return false;
int row = -1;
{
int l = 0, r = matrix.size() - 1;
while(l <= r)
{
int mid = l + (r - l) / 2;
if(target < matrix[mid].front())
r = mid - 1;
else if(target > matrix[mid].back())
l = mid + 1;
else
{
row = mid;
break;
}
}
}
if(row == -1) return false;
bool ans = BinarySearch(matrix[row], target);
if(row > 0) ans = ans | BinarySearch(matrix[row-1], target);
if(row < matrix.size()-1) ans = ans | BinarySearch(matrix[row+1], target);
return ans;
}
bool BinarySearch(vector<int> &arr, int target)
{
int l = 0, r = arr.size() - 1;
while(l <= r)
{
int mid = l + (r - l) / 2;
if(target > arr[mid])
l = mid + 1;
else if(target < arr[mid])
r = mid - 1;
else
return true;
}
return false;
}
int main()
{
int m, n, target;
while(cin>>m>>n>>target)
{
vector<vector<int> > matrix(m, vector<int>(n));
for(int i = 0; i < m; ++i)
for(int j = 0; j < n; ++j)
scanf("%d", &matrix[i][j]);
if(SearchMatrix(matrix, target))
printf("Yes\n");
else
printf("No\n");
}
return 0;
}