剑值offer 面试题4:在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
示例:
现有矩阵 matrix 如下:
[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]
代码实现:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target)
{
int i = matrix.size() - 1;
int j = 0;
while(i >= 0 && j < matrix[0].size())
{
if(matrix[i][j] > target) //比目标整数大,则i--
i--;
else if(matrix[i][j] < target) //比目标整数小,则j++
j++;
else
return true;
}
return false;
}
void test01()
{
vector<vector<int>> matrix ={{1,4,7,11,15},{2,5,8,12,19},{3,6,9,16,22},{10,13,14,17,24},{18,21,23,26,30}};
int target;
cout << "输入目标数字: " ;
cin >> target;
bool ret = findNumberIn2DArray(matrix,target);
if(ret == false)
{
cout << "未找到目标数字" << endl;
}
else
{
cout << "找到目标数字,目标数字为:" << target << endl;
}
}
int main(void)
{
test01();
return 0;
}