算法学习-04-二维数组中的查找-C++
- 题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- 输入:7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
- 输出:true
- 分析:我们可以采用最简单直接的方法,直接遍历二维数组,时间复杂度为O(n^2)。但是这种方法没有充分利用给出的二维数组行和列递增的特点。首先我们知道,如果在一维有序数组中,我们可以采用折半查找的方法来加快查找速度,同理我们可以将这种思路扩展到二维数组上(详细推理过程可以参考二维数组的查找):
大概步骤如下:
1)我么设初始值为右上角元素,arr[0][5] = val,目标tar = arr[3][1]
2)接下来进行二分操作:
3)如果val == target,直接返回
4)如果 tar > val, 说明target在更大的位置,val左边的元素显然都是 < val,间接 < tar,说明第 0 行都是无效的,所以val下移到arr[1][5]
5)如果 tar < val, 说明target在更小的位置,val下边的元素显然都是 > val,间接 > tar,说明第 5 列都是无效的,所以val左移到arr[0][4]
6)继续步骤2)
C++代码实现
bool Find(int target, vector<vector<int> > array) {
int m = array.size(), n = array[0].size();
if(m == 0 || n == 0) return false;
int row = 0, column = n - 1;
while(row < m && column >= 0){
if(array[row][column] == target) return true;
else if(array[row][column] > target) column--;
else row++;
}
return false;
}
参考文章:
牛客网——二维数组中的查找