#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_
C++笔试题(剑指offer 面试题3 二维数组中查找数)
最新推荐文章于 2023-10-01 17:15:15 发布