题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路:从二维数组的右上角的元素开始判断,因为此元素是它所在行的最大数,是它所在的列的最小数。如果它等于要查找的数字,则查找过程结束。如果它大于要查找的数字,则可以排除它所在的列。如果它小于要查找的数字,则可排除它所在的行。这样如果要查找的数字不在数组的右上角,则每次判断都可以排除一行或一列以缩小查找范围,直到找到要查找的数字,或者查找范围为空。
#include <iostream>
using namespace std;
bool find(int *matrix, int cols, int rows, int number) //强制转化为一维数组
{
bool found = false;
if ( matrix!=NULL && cols>0 && rows>0 )
{
int row = 0;
int col = cols-1;
while(row<rows && col >=0)
{
if ( matrix[row*cols+col] == number )
{
found = true;
break;
}
else if ( matrix[row*cols+col] > number )
col--;
else
row++;;
}
}
return found;
}
void test1() // 要查找的数在数组中
{
int a[][4] = { {1 ,2 ,8 , 9 }, { 2 , 4 ,9 ,12 }, { 4 , 7 , 10 , 13 },{ 6 , 8 , 11 , 15 } };
cout<<"test1 : "<<find( (int *) a ,4 , 4 ,7)<<endl;
}
void test2() // 要查找的数不在数组中
{
int a[][4] = { {1 ,2 ,8 , 9 }, { 2 , 4 ,9 ,12 }, { 4 , 7 , 10 , 13 },{ 6 , 8 , 11 , 15 } };
cout<<"test2 : "<<find( (int *) a ,4 , 4 ,5)<<endl;
}
void test3() //空指针
{
cout<<"test3 : "<<find( NULL ,4 , 4 ,5)<<endl;
}
void test4() // 要查找的数是数组中最小的数字
{
int a[][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
cout<<"test4 : "<<find( (int *) a ,4 , 4 ,1)<<endl;
}
void test5()// 要查找的数是数组中最大的数字
{
int a[][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
cout<<"test5 : "<<find( (int *) a ,4 , 4 ,15)<<endl;
}
void test6() // 要查找的数比数组中最小的数字还小
{
int a[][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
cout<<"test6 : "<<find( (int *) a ,4 , 4 ,0)<<endl;
}
void test7() // 要查找的数比数组中最大的数字还大
{
int a[][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}};
cout<<"test7 : "<<find( (int *) a ,4 , 4 ,16)<<endl;
}
void main()
{
test1();
test2();
test3();
test4();
test5();
test6();
test7();
}
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。