二维数组中查找是否存在该数
1.条件描述:
- 定义一个二维数组(其中包含的一维数组的长度相同)。
- 行中从左至右进行递增。
- 列中从上至下进行递减。
2.问题:
- 给定一个整数,判断该二维数组中是否存在该整数
3.解题思路:
4.解题过程:
bool NiuKe::findNum(int iTarget, vector<vector<int> > vecNum)
{
//定义搜索元素在二维数组左下角,开始寻找
int iColIndex = 0; //列下标
int iRowIndex = vecNum.size() - 1; //行下标
//循环条件:列与行未被搜索完成,进行循环
while(iColIndex < vecNum.size() && iRowIndex >= 0)
{
if(iTarget > vecNum[iColIndex][iRowIndex]) //目标数字 > 搜索元素
{
++iColIndex; //向存在更大值得列进行搜索
}
else if(iTarget < vecNum[iColIndex][iRowIndex]) //目标数字 < 搜索元素
{
--iRowIndex; //向存在更小值的行进行搜索
}
else //目标数字 == 搜索元素
{
return true; //已找到改整数
}
}
return false; //未找到该整数
}
int main()
{
vector<vector<int> > vecNum = {{1, 2, 3}, {3, 4, 5}, {4, 5, 6}};
NiuKe NiuTest;
bool bFind = NiuTest.findNum(6, vecNum);
cout << bFind << endl;
return 0;
}
5.题后小结:
- 本题可采用暴力的循环方法破解,逐个搜索,时间复杂度为O(n)。但由于题中数组给予了特殊设定,采用上述方法,进行逐行或逐列的搜索,可降低时间复杂度 (时间复杂度为 O(行 + 列))。
6.知识点延伸:
- 常见时间复杂度:O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)
- 一般来说对于程序时间复杂度,默认计算最坏时间复杂度。
- 时间复杂度计算后,取其最高阶进行表示(执行次数(时间频度) T(n) = 2n + 3 表示为 O(2n )),使用大O表示法。
名称 | 时间复杂度例子 | 运行时间 |
---|---|---|
常数时间 | 10 | O(1) |
对数时间 | logn | O(logn) |
线性时间 | n + 10 | O(n) |
线性对数时间 | nlogn | O(nlogn) |
二次时间 | n2 | O(n2) |
三次时间 | n3 | O(n3) |
指数时间 | 2n | O(2n) |
阶乘时间 | n! | O(n!) |
指数时间 | nn | O(nn) |