题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
方法一:从右上角的数开始查找,若该数字大于查找的数,则该列减一;若该数字小于查找的数字,则该行减一;若两数相等,则结束查找。
#include <cstdio>
bool Find(int *matrix, int rows, int columns, int number)
{
int Found = false;
int row = 0;
int column = columns - 1;
if (matrix != nullptr && rows > 0 && columns > 0)
{
while (row < rows&&column >= 0)
{
if (matrix[row*columns + column] == number)
{
Found = true;
break;
}
else if (matrix[row*columns + column] > number)
--column;
else
++row;
}
}
return Found;
}
//测试用例
//查找的数在数组
void Test1()
{
int matrix[][4] = { {1,2,8,9,},{2,4,9,12},{4,7,10,13},{6,8,11,15} };
if (Find(*matrix, 4, 4, 7))
printf("Find it!\n");
else
printf("Fail!\n");
}
//查找的数不在数组
void Test2()
{
int matrix[][4] = { {1,2,8,9,},{2,4,9,12},{4,7,10,13},{6,8,11,15} };
if (Find(*matrix, 4, 4, 3))
printf("Find it!\n");
else
printf("Fail!\n");
}
//输入空指针
void Test3()
{
int matrix[][4] = { {1,2,8,9,},{2,4,9,12},{4,7,10,13},{6,8,11,15} };
if (Find(nullptr, 4, 4, 7))
printf("Find it!\n");
else
printf("Fail!\n");
}
int main()
{
Test1();
Test2();
Test3();
return 0;
}
方法二:从左下角开始,原理和方法一同。
#include <cstdio>
bool Find(int *matrix, int rows, int columns, int number)
{
int Found = false;
int row = rows - 1;
int column = 0;
if (matrix != nullptr && rows > 0 && columns > 0)
{
while (row < rows&&column >= 0)
{
if (matrix[row*columns + column] == number)
{
Found = true;
break;
}
else if (matrix[row*columns + column] < number)
++column;
else
--row;
}
}
return Found;
}
//测试用例
//查找的数在数组
void Test1()
{
int matrix[][4] = { {1,2,8,9,},{2,4,9,12},{4,7,10,13},{6,8,11,15} };
if (Find(*matrix, 4, 4, 7))
printf("Find it!\n");
else
printf("Fail!\n");
}
//查找的数不在数组
void Test2()
{
int matrix[][4] = { {1,2,8,9,},{2,4,9,12},{4,7,10,13},{6,8,11,15} };
if (Find(*matrix, 4, 4, 3))
printf("Find it!\n");
else
printf("Fail!\n");
}
//输入空指针
void Test3()
{
int matrix[][4] = { {1,2,8,9,},{2,4,9,12},{4,7,10,13},{6,8,11,15} };
if (Find(nullptr, 4, 4, 7))
printf("Find it!\n");
else
printf("Fail!\n");
}
int main()
{
Test1();
Test2();
Test3();
return 0;
}