题目:在一个二维数组中,每一行都按照从左到右的顺序排序,每一列都按照从上到下递增的顺序排序。输入这样的一个数组和一个整数,判断数组中是否含有该整数。
原本思路:两个for循环判断,但这样没有考虑到题目要求的递增规则,不符合题意。
思路:
本题的关键点在于选取开始查找的位置,即矩阵的左上角数或右下角数。
如左上角数,查找数先与左上角数进行比较,如果相等,即查找成功,如查找数大于左上角数,则第一行不用再查找,如果查找数小于左上角,则最后一列不用再查找。依次....
这样每次判断就可以减少一行的判断量,这样最坏的情况,时间复杂度为:O(rows-1 + columns-1)
源代码
#include <stdio.h>
#include <stdlib.h>
bool Find(int** matrix,int rows,int columns);
bool Find(int** matrix,int rows,int columns,int number)
{
bool found=false;
if(matrix !=NULL && rows>0 && columns>0)
{
int row=0;
int column=columns-1;
printf("矩阵不为空!");
while(row<rows && column >=0)
{
printf("正在查找...%d\n",matrix[row][column]);
if(matrix[row][column]==number)
{
found=true;
break;
}
else if(matrix[row][column]<number)
row++;
else
column--;
}
}
return found;
}
int main()
{
int i,j;
int rows,columns;
printf("输入行,列大小:");
scanf("%d %d",&rows,&columns);
//int **A=(int **) malloc (rows*columns* sizeof(int));
int **A;
A=new int *[rows];
for(i=0;i<rows;i++)
A[i]=new int[columns];
printf("输入矩阵:");
for(i=0;i<rows;i++)
{
for(j=0;j<columns;j++)
{
scanf("%d",&A[i][j]);
}
}
printf("输入要查找的数:");
int number;
scanf("%d",&number);
bool flag;
flag=Find(A,rows,columns,number);
if(flag==true)
printf("已找到!");
else
printf("未发现!");
return 0;
}
结果
已找到!hadoop@master:~/algorithm/第二章$ g++ -c 03.cpp
hadoop@master:~/algorithm/第二章$ g++ 03.o -o 03
hadoop@master:~/algorithm/第二章$ ./03
输入行,列大小:4 4
输入矩阵:1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
输入要查找的数:7
矩阵不为空!正在查找...9
正在查找...8
正在查找...2
正在查找...4
正在查找...7
已找到!