关闭

二维数组中的查找

标签: 二维数组二维数组中的查找
227人阅读 评论(0) 收藏 举报
分类:

题目

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

例如下面的二维数组就是每行、每列都增序排序。如果在这个数组中查找数字13,则返回true;如果查找数字15,由于数组不含有该数字,则返回false。

    1   2   7   10
    5   8   9   11
    7   13  14  17
   20   25  27  30

分析

图a
假设要查找的数字数字是13,首先我们选取数组的右上角的数字10。由于13大于10,根据题目要求数组每一行都是从左到右递增的顺序排序,所以10是第一行最大的数,因此第一行不存在比13还大的数字。于是把这一行从需要考虑的区域内剔除,之后只需分析剩下来的3行(即图中的红色圈的区域)。

图b
在剩下的3行中,右上角的数字为11。同样11小于13,因此11所在的行应该剔除,之后剩下只需分析两行(即图中的红色圈的区域)。

图c
在剩下的2行中,右上角的数字为17。17大于13,根据题目要求数组的每一列都是从上到下递增顺序排列,所以17是第四列最小的数,因此第四列不存在比13还小的数字。于是把这一列剔除,之后剩下只需分析2行3列(即图中红色圈的区域)。

图d
在剩下的数字中,右上角的数字为14,14大于13,同理14所在列应该剔除,之后剩下2行2列(即图中红色圈的区域)。

代码

#include<stdio.h>

/** 
 *matrix 输入二维数组的地址
 rows    二维数组的行数 
 columns 二维数组的列数
 number  要查找的数
 **/
bool find(int *matrix, int rows, int columns, int number) {
    bool result = false;

    //rows = 行,column = 列
    //检测函数的入口参数是否合法 
    if(matrix != NULL && columns >0 && rows > 0) {

        //定位右上角的数组元素
        int rowtemp = 0;
        int columntemp = columns - 1;

        //当查找是的行数小于总的行数和查找的列数大于等0,则在循环查找,直到查找到为止。
        while(rowtemp < rows && columntemp >= 0  ) {

            //如果右上角的数大于查找的数,剔除右上角的数所在列
            if( matrix[rowtemp * columns + columntemp] > number) {

                printf("  >  -->  %d\n", matrix[rowtemp * columns + columntemp]);
                columntemp--;

            //如果右上角的数小于查找的数,剔除右上角的数所在的行
            } else if ( matrix[rowtemp * columns + columntemp] < number) {

                printf("  <  -->  %d\n", matrix[rowtemp * columns + columntemp]);
                rowtemp++;

            //如果右上角的数等于查找的数
            } else if ( matrix[rowtemp * columns + columntemp] == number) {

                printf("  ==  -->  %d\n", matrix[rowtemp * columns + columntemp]);
                result = true;
                //如果找到则退出while循环
                break;
            }

        }


    }
    return result;

}

void  main() {

    int a[4][4] = { {1,2,7,10},{5,8,9,11},{7,13,14,17},{20,25,27,30}};  

    printf("find result =  %d\n",find(&a[0][0],4,4,13));

}

截图

这里写图片描述

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:8106次
    • 积分:279
    • 等级:
    • 排名:千里之外
    • 原创:20篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条