您的位置:首页 > Web前端

[剑指Offer]二维数组中的查找

2013-06-24 17:10 197 查看
思路:这题二维矩阵少了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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: