二维数组中的查找

原创 2015年11月20日 22:10:55

题目

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

例如下面的二维数组就是每行、每列都增序排序。如果在这个数组中查找数字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));

}

截图

这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。

剑指offer-二维数组中的查找

问题题目:[二维数组中的查找]思路蛮力法肯定可以做。 但是考虑有序的特性,所以,二分查找。 但是,我做的是否还是犯了错误。那证明这题出的很成功嘛! 因为我是认为这个数组是这样的: 1.0 2....

java 基础数据遍历(2)----二维数组查找

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

3 - 在有序二维数组中查找元素

题目描述:http://ac.jobdu.com/problem.php?pid=1384在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入...

剑指offer 面试题3 二维数组中的查找

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

二维数组中查找是否存在一个数

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下的递增的顺序排列。写一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。例如下面的二维数组就是每行,每列都的...
  • wsdssss
  • wsdssss
  • 2016年11月21日 15:53
  • 503

剑指offer之面试题3:二维数组的查找

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

剑指offer-面试题3:二维数组中的查找

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

剑指Offer_面试题03_二维数组中的查找

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

面试题3 ----二维数组中的查找

题目:         在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二维数组中的查找
举报原因:
原因补充:

(最多只允许输入30个字)