剑指Offer3 二维数据中的查找

题目:

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

例如下面的二维数组就是每行,每列都递增排序,如果在这个数组中查找数字7,则返回TRUE,如果查找到数字5,由于数组中不含有该数字,则返回FALSE,

1 2 8 9

2 4 8 12

4 7 10 13

6 8 11 15



分析:

这个题相对简单一些,如果一开始没有思路,那么就自己模拟出两个数来测试一下,于是就能拿上找到规律,比如要寻找的是7,咱们从数组第一个数开始遍历,1<7,那么咱们要怎么走,往下走是在增大,往右走也是在增大。于是我们就想有没有一种可能往两个方向走就会有两种数字的发展方向,想到在坐标系中,第三像素就是咱们需要的方式,于是咱们就可以从数组的右上角开始遍历,往左走在减小,往下走在增大,这样就是我们想要的结果了。

其实这样的情况让我想到了搜索树,节点的左孩子都比该节点小,又孩子都比该节点大。

下面就是代码实现了


#include <iostream>


using namespace std;


bool Find(int *data,int rows,int columns,int num)
{
    bool hasFound = false;
    if(data != NULL && rows>=0 && columns >= 0)
    {
        int row = 0 ;
        int column = columns;
        while(row <= rows && column >= 0)
        {
            if(data[row*(columns+1)+column] == num)
            {
                hasFound = true;


                break;
            }
            else if(data[row*(columns+1)+column] > num)
                column--;
            else
                row++;
        }
        return hasFound;
    }
}


int main()
{
    int data[16] = {1,2,8,9,
                      2,4,9,12,
                      4,7,10,13,
                      6,8,11,15};
    bool hasfind = Find(data,3,3,7);
    cout<<hasfind<<endl;


    return 0;
}



这里我用了一个一维数据来模拟二维数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值