二维数组中的查找

题目

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

例如下面的二维数组就是每行、每列都增序排序。如果在这个数组中查找数字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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值