题目描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思考:在这个二维数组的每一行中,最左边的数字是最小的,在每一列中,最上面的数字是最小的;那么,我们可以找到一个中间值(即第一行的最右边元素,也是最后一列的第一个元素);让这个中间值和整数比较,若中间值小于该整数,则说明这一行的值都小于该整数(即可以排除该行),若中间值大于该整数,则说明该列的所有元素都大于该整数(即可以排除该列)。
排除一行或一列后,重新找到这个中间值(剩余数组的右上角的值),继续上述比较规则,知道最后剩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' #endif2、编写测试 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、测试结果