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

【题目】在一个二维数组中,每一行按照从左到右递增顺序排序,每一列按照从上到下递增的顺序排序。完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
如下矩阵
如同上图中二维数组,如果在这个数组中寻找目标数7,找到则返回true,否则返回false。


【分析】选择中间的数字进行比较时,比如选9,9>7,所以目标位置存在于9的位置的左边或上边,如此比较,并不能快速筛选有效信息,故选择边缘角落值一一筛选,以右上角落9与7比较,9>7,故目标位置一定不在最后一列,筛除后,再看8,8>7,筛除第三列,再看2,2<7,筛除第一行,看4<7,筛除第二行,看7=7,返回找到目标值。


【算法实现】

#include<stdio.h>

typedef int bool;  
#define true 1  
#define false 0 

bool Find(int* matrix, int rows, int columns, int number)

{
    bool found = false;
    if(matrix != NULL && rows >0 && columns > 0)
    {
        int row = 0;
        int column = columns -1 ; 
        while(row < rows && column >=0)
        {

            if(matrix[row*columns + column] == number)
            {
                found = true;
                break;
            }
            else if (matrix[row*columns + column]>number)
                --column;
            else
                ++row;
        }
    }
    return found;
}

int main()
{
    int data[4][4] = {1,2,8,9, 2,4,9,12 ,4,7,10,13,6,8,11,15};
    int *p =data[0];
    if( Find(p, 4, 4, 1)==true)
        printf("find it");
    else
        printf("not find");

    return 0;
}

【代码分析】
代码中涉及到二维数组转换成一维指针的过程,二维数组虽然在写法上是二维的,但在内存存储时依然是依次排列,一行接着一行,可以用*p进行访问,但是在写法上应该注意,指针应该指向数组的首地址,而二维数组首地址data[0] , 将二维数组看成是n个一维数组组成的.
一维数组data[4]的首地址为data, *data = data[0] ;
二维数组data[4][4]的首地址是data[0], *data = data[0];
二维数组第i行首地址*(data+i) = data[0+i];
二维数组data[m][n]中任意元素在内存中存储的位置用指针寻找是p[i*n+j].
*data = data=data[0]=&data[0][0]
data[0]=*(data+0)


【注意】二维数组与指针之间的关系,c语言中没有自定义bool量,故需要自己定义

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值