思想:
从大范围,一点一点缩小,找到最大的边界,然后删行或者删列
#include <iostream>
using namespace std;
//二维数组查找数字
//每次从右上角入手
//记右上角为m,要查找的数字为n
//若m>n,表示右上角大于n,则右上角所在列都>n ==> 删除m所在列
//若m<n, 表示右上角小于n, 则右上角右边或者下面有可能
// 但是,右上角没有右边,则只有下面 ==> 删除m所在行
//循环,从而得出结果
bool findNum(int* matrix, int rows, int cols, int num)
{
int m_row = 0;
int m_col = cols - 1;
//边界 rows>=0 cols>=0 matrix!=null
if (rows < 0 || cols < 0 || matrix == nullptr)
{
return false;
}
while (m_row <rows-1 && m_col >= 0)
{
int m = matrix[m_row*cols+m_col];
//m>n,删除m所在列
if (m > num)
{
m_col--;
}
//m<n ,删除m所在行
else if (m < num)
{
m_row++;
}
// m==n
else
{
return true;
}
}
return false;
}
int main()
{
int matrix[16] = {
1,2,8,9,
2,4,9,12,
4,7,10,13,
6,8,11,15
};
int rows = 4;
int cols = 4;
int num = 7;
bool flag = findNum(matrix, rows, cols, num);
cout << flag << endl;
system("pause");
return 0;
}