class Solution {
public:
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target)
{
int rowSize = matrix.size();
if(matrix.empty())//如果数组为空
{
return false;
}
int colSize = matrix[0].size();
if(matrix[0].empty())
{
return false;
}
//在第一行中向右遍历
int targetCol = 0;
for(int i = 0;i < colSize;i++)
{
if(target < matrix[0][i]) //刚好小于就是的那一列的前面一列就是目标列
{
if(i < 1)//只有一个数字的特殊情况
{
return false;
}
targetCol = i -1;
break;
}
else if(target == matrix[0][i] )
{
return true;
}
targetCol = i; //如果达到了最大列
}
//在选中的列中向下遍历
int targetRow = 0;
for(int j = 0;j < rowSize;j++)
{
if(target < matrix[j][targetCol])
{
targetRow = j ;
break;
}
else if(target == matrix[j][targetCol])
{
return true;
}
targetRow = j;
}
//在最大行向右遍历
if(targetRow == rowSize)
{
for(int a = targetCol; a < colSize;a++)
{
if(target == matrix[targetRow][targetCol])
{
return true;
}
}
}
//从第一列向下遍历
int tagetRow2 = 0;
for(int b = 0;b < rowSize;b++)
{
if(target < matrix[b][0])
{
tagetRow2 = b ;
break;
}
if(target == matrix[b][0])
{
return true;
}
tagetRow2 = b ;
}
//此时确定了右上角的顶点和左下角的顶点,数据就在这个小矩形之内
for(int n = targetRow;n <= tagetRow2;n++)
{
for(int m = 1;m <= targetCol;m++)
{
if(target == matrix[n][m])
{
return true;
}
}
/*
//二分法
if(findNumberIn1DArray(matrix[n],target,1,targetCol) == true)
{
return true;
}
*/
}
return false;
}
//二分法
bool findNumberIn1DArray(vector<int>& matrix, int target,int a ,int b)
{
while( b > a)
{
if(matrix[floor((a+b) / 2)] > target)
{
b =floor((a+b) / 2);
}
if(matrix[floor((a+b) / 2)] < target)
{
a =ceil((a+b) / 2);
}
else if(matrix[floor((a+b) / 2)] == target)
{
return true;
}
}
return false;
}
};
二维数组中的查找
最新推荐文章于 2022-10-18 16:27:30 发布