题目描述:
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路:
二维数组规律是:每行从左到右递增;每列从上到下递增。如下一个例子:
1 | 2 | 8 | 9 |
2 | 4 | 9 | 12 |
4 | 7 | 10 | 13 |
6 | 8 | 11 | 15 |
本题可从左下角或者右上角开始,例如从右上角开始,使右上角数字与要查找的数字作比较,有三种情况:
- 右上角数字与要查找的数字大小相等,则返回true
- 右上角数字比要查找的数字大,则说明最右边一列都比目标数字大,则去掉最右一列,向左移动一列
- 右上角数字比要查找的数字小,则说明最上面一行都比目标数字小,则去掉最上一行,向下移动一列
按此规律一直移动,如果找到目标数字,则返回true;如果位置超出最左边界或最下边界,则说明无匹配,返回false
参考源码:
#include <iostream>
#include <vector>
using namespace std;
class Solution
{
public:
bool Find(int target, vector<vector<int> > array)
{
if (array.size() == 0 || array[0].size() == 0) return false;
int row = array.size()-1;
int column = array[0].size()-1;
int row_move = 0;//移动位置所在的行数
int column_move = column;//移动位置所在的列数
while (row_move <= row && column_move >= 0)
{
if (array[row_move][column_move] == target)
{
return true;
}
else if (array[row_move][column_move] > target)
{
column_move--;
//continue;
}
else if (array[row_move][column_move] < target)
{
row_move++;
//continue;
}
}
return false;
}
};
//测试用例
int main()
{
vector<vector<int>> array;
vector<int> insert;
insert.push_back(1);
insert.push_back(2);
insert.push_back(8);
insert.push_back(9);
array.push_back(insert);
insert.clear();
insert.push_back(2);
insert.push_back(4);
insert.push_back(9);
insert.push_back(12);
array.push_back(insert);
insert.clear();
insert.push_back(4);
insert.push_back(7);
insert.push_back(10);
insert.push_back(13);
array.push_back(insert);
insert.clear();
insert.push_back(6);
insert.push_back(8);
insert.push_back(11);
insert.push_back(15);
array.push_back(insert);
insert.clear();
Solution s;
if (s.Find(11,array))
{
cout << "yes" << endl;
}
else
{
cout << "no" << endl;
}
system("pause");
return 0;
}