二维数组查找
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
// 方法一:
bool Find(int target, vector<vector<int> > array) {
int rows = 0;
int cols = 0;
int i = 0;
int j = 0;
rows = array.size();
if (rows == 0) {
return false;//判断是否为0行
}
cols = array[0].size();
if (cols == 0) {
return false;//判断是否为0列
}
//判断是否越界,小于最小的或大于最大的
if (target < array[0][0] || target > array[rows-1][cols-1]){
return false;
}
i = 0, j = cols - 1;//将数组定位到第0行最后一个元素
//1. 若target大于第0行的最后一个,则一定大于本行所有,则移到下一行的最后一个元素
while (i < rows){
if (target == array[i][j])
return true;
else if (target > array[i][j])
++i;
else
--j;
}
return false;
}
//方法二
bool Find(int target, vector<vector<int> > array) {
int rows = 0;
int cols = 0;
int i = 0;
int j = 0;
rows = array.size();
if (rows == 0) {
return false;//判断是否为0行
}
cols = array[0].size();
if (cols == 0) {
return false;//判断是否为0列
}
//判断是否越界,小于最小的或大于最大的
if (target < array[0][0] || target > array[rows-1][cols-1]) {
return false;
}
i = rows - 1, j = 0;//将数组定位到第0行最后一个元素
//1. 若target大于第0行的最后一个,则一定大于本行所有,则移到下一行的最后一个元素
while (i >= 0) {
if (target == array[i][j])
return true;
else if (target < array[i][j])
--i;
else
++j;
}
return false;
}
//方法三
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
int rows = 0; //行数
int cols = 0; //列数
int right_row = 0;//右上角的行号
int right_col = 0;//右上角的列号
int left_row = 0;//左下角的行号
int left_col = 0;//左下角的列号
rows = array.size();
if (rows == 0) //判断是否为0行
{
return false;
}
cols = array[0].size();
if (cols == 0) //判断是否为0列
{
return false;
}
right_row = 0, right_col = cols - 1;//右上角坐标
left_row = rows - 1, left_col = 0;//左下角坐标
while (right_row <= left_row
&& right_col >= left_col
&& target >= array[right_row][left_col] // target必须大于等于最小值
&& target <= array[left_row][right_col])// target必须小于等于最大值
{
//右上角
if (target == array[right_row][right_col])
return true;
else if (target > array[right_row][right_col])
++right_row;
else
--right_col;
//左下角
if (target == array[left_row][left_col])
return true;
else if (target > array[left_row][left_col])
++left_col;
else
--left_row;
}
return false;
}
};