更多题目请点这里《剑指offer》纪念版:目录索引
1、题目:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数
2、分析:
从题目可以看出数组的规律和杨氏矩阵一样,从左到右依次递增,从上到下依次递增,数组每一行最大元素都在最右列,每一行最小元素都在第一列,因此我们从数组右上角元素开始查找(即第一行最后一个元素),如果查找的数大于右上角元素,则说明当前行没有查找的数,删除当前行,如果查找数小于右上角元素,则删除该列。
3、二维数组代码实现:
int findnum(int num , int row, int col,int a[3][3])
{
if (a == NULL || row < 0 || col < 0)
{
return -1;
}
while(row < 3 && col >= 0)
{
if(num > a[row][col])
{
row++;
}
else if(num < a[row][col])
{
col--;
}
else
{
return a[row][col];
}
}
return 0;
}
void test1()
{
int a[3][3] =
{
1 , 3 , 5,
6 , 8 , 9,
10 , 11 , 12,
};
//测试用例
printf("%d \n", findnum(1, 0, 2 , a));
printf("%d \n", findnum(3, 0, 2 , a));
printf("%d \n", findnum(5, 0, 2 , a));
printf("%d \n", findnum(6, 0, 2 , a));
printf("%d \n", findnum(8, 0, 2 , a));
printf("%d \n", findnum(9, 0, 2 , a));
printf("%d \n", findnum(10, 0, 2 , a));
printf("%d \n", findnum(11, 0, 2 , a));
printf("%d \n", findnum(12, 0, 2 , a));
printf("%d \n", findnum(2, 0, 2 , a));
}
4、一维数组代码实现:
bool FindNum(int *a,int rows,int cols,int num)
{
int found = false;
int row = 0;
int col = cols - 1;
if(rows > 0 && cols >0 && a != NULL)
{
while(row < rows && col >= 0)
{
if(num > a[ row * cols + col])//计算最右边的数
{
++row;
}
else if(num < a[ row *cols+ col])
{
--col;
}
else
{
found = true;
break;
}
}
return found;
}
return false;
}
void Test2()
{
int a[][3] = { 1, 3, 5, 6, 8, 9, 10, 11, 12, };
int number = 12;
if (FindNum(a, 3, 3, number))
{
printf("find\n");
}
else
{
printf("No find\n");
}
}