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

#ifndef F_FIND_WORK_TEST3_ARRAY_20171030_JHASKDFJHASF_H_
#define F_FIND_WORK_TEST3_ARRAY_20171030_JHASKDFJHASF_H_

#include <stdio.h>

/*
剑指offer 面试题3
二维数组中查找
在一个二维维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上都下递增的顺序排序。
请完成一个函数,输入这样一个二维数组 和 一个整数,
1)判断数组中是否存在这个整数
2)如果存在,通过引用返回索引。

二维数组格式如下
1,  4,  7,  10
2,  6,  9,  12
8,  12, 13, 15
14, 16, 17, 19

方法:将需要查找的数, 与右上角的数作对比,一行,一列的排除,每次缩小查找范围。减少循环次数。
*/

BOOL FindDataFromArray(int *pArrayData, const int nRows, const int nColumns, const int nFindData, int& nIndex);
bool FindDataFromVector(vector<vector<int>> vArray, const int nValue);

//测试
void F_Test3_Array()
{
    int nIndex(-1);

    //二维数组
    int nArray[4][4] = {{3,5,6,9}, 
                        {7,8,10,12}, 
                        {11,13,14,16},
                        {17,19,20,23}};
    BOOL bIsFindData = FindDataFromArray(*nArray, 4, 4, 13, nIndex);

    //一维数组
    int nArray1[] = {3,5,6,9, 7,8,10,12, 11,13,14,16, 17,19,20,23};
    BOOL bIsFindData1 = FindDataFromArray(nArray1, 4, 4, 16, nIndex);

    //不存在
    bIsFindData1 = FindDataFromArray(nArray1, 4, 4, 116, nIndex);

    //容器存储数据,类似于维维数组
    vector<vector<int>> vArray;
    vector<int> vTemp;

    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            vTemp.push_back(nArray[i][j]);
        }

        vArray.push_back(vTemp);
        vTemp.clear();
    }

    bIsFindData = FindDataFromVector(vArray, 7);
}

BOOL FindDataFromArray(int *pArrayData, const int nRows, const int nColumns, const int nFindData, int& nIndex)
{
    BOOL bIsFindData(FALSE);

    if(pArrayData && (nRows > 0) && (nColumns > 0))
    {
        int nCurData(0);
        int nCurRow(0);
        int nCurColumn = nColumns - 1;

        while((nCurRow < nRows) && (nCurColumn > 0))
        {
            nIndex = nCurRow*nColumns + nCurColumn;
            nCurData = pArrayData[nIndex];

            if(nCurData == nFindData)
            {
                bIsFindData = TRUE;
                break;
            }
            else if(nCurData < nFindData)
            {
                nCurRow++;
            }
            else
            {
                nCurColumn--;
            }
        }
    }

    nIndex = bIsFindData == 0 ? -1: nIndex;
    return bIsFindData;
}

bool FindDataFromVector(vector<vector<int>> vArray, const int nFindValue)
{
    if(vArray.empty())
    {
        return false;
    }

    bool bIsFindValue(false);

    int nRow = vArray.size();
    int nColumn = vArray[0].size();

    int nCurRow(0);
    int nCurColumn(0);

    for(; nCurRow<nRow; )
    {
        int nCurData = vArray[nCurRow][nColumn-1];
        if(nCurData == nFindValue)
        {
            bIsFindValue = true;
            break;
        }
        else if(nCurData < nFindValue)
        {
            nCurRow++;
        }
        else
        {
            nColumn--;
        }
    }

    return bIsFindValue;
}

#endif//F_FIND_WORK_TEST3_ARRAY_20171030_JHASKDFJHASF_H_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值