题目描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思考:在这个二维数组的每一行中,最左边的数字是最小的,在每一列中,最上面的数字是最小的;那么,我们可以找到一个中间值(即第一行的最右边元素,也是最后一列的第一个元素);让这个中间值和整数比较,若中间值小于该整数,则说明这一行的值都小于该整数(即可以排除该行),若中间值大于该整数,则说明该列的所有元素都大于该整数(即可以排除该列)。
排除一行或一列后,重新找到这个中间值(剩余数组的右上角的值),继续上述比较规则,知道最后剩1个元素,如果该元素于这个整数不相等,则终止循环,返回false;否则,终止循环,返回true。
代码实现(C语言):
1、首先定义自己的 myUtil.h 文件。
#ifndef _MY_UTIL_H_
#define _MY_UTIL_H_
/*
自定义myUtil.h文件
文件中 定义了Boolean类型
定义了TRUE和FALSE
*/
typedef unsigned char boolean;
#define FALSE '0'
#define TRUE '1'
#endif
2、编写测试 test.c 文件。
#include <stdio.h>
#include "myUtil.h"
boolean FindNum(char **array, int rows, int columns, int num);
boolean FindNum(char **array, int rows, int columns, int num) {
boolean result = FALSE;
int row;
int col;
int i = 0;
int j = 0;
int tag = 0;//tag标记,在方法中输出二维数组时所需要的标记
if(array == NULL || rows < 0 || columns < 0) {
printf("数组输入有误……\n");
return result;
}
row = 0;
col = columns - 1;
// printf("使用传递过来的二维数组参数输出二维数组\n");
// for(i = 0; i < rows*columns; i++) {
// printf("%d,", array[i]);
// if(tag == columns-1) {
// tag = 0;
// printf("\n");
// } else {
// tag++;
// }
// }
printf("要查找的数字:%d\n", num);
while(row < rows && col >= 0) {
//printf("%d\n", col);
if(array[row*col + col] == num) {
result = TRUE;
break;
}
if(array[row*col + col] > num) {
col--;
} else {
row++;
}
}
return result;
}
int main(int argc, char const *argv[])
{
/* code */
int i;
int j;
boolean result;
int array[5][5] = { {1,2,8,9,11},
{2,4,9,12,13},
{4,7,10,13,15},
{6,8,11,15,18},
{10,12,14,18,22},};
int num = 0;
printf("请输入一个整数num:\n");
scanf("%d", &num);
result = FindNum(array, 5, 5, num);
printf("结果为【%s】\n", result == '0' ? "数组中不存在此元素" : "数组中存在此元素");
return 0;
}
3、测试结果