七周打卡剑指offer《二维数组中的查找》
Posted JunMain
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了七周打卡剑指offer《二维数组中的查找》相关的知识,希望对你有一定的参考价值。
二维数组中的查找
题目描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
样例
输入数组:
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
如果输入查找数值为7,则返回true,
如果输入查找数值为5,则返回false。
暴力做法 O( n 2 n^2 n2)
思路:
先扫描第一行找出比target小的最大数字记录下标k1
再扫描第一列找出比target小的最大数字记录下标k2
然后两重循环遍历数组
class Solution {
public:
bool searchArray(vector<vector<int>> array, int target) {
if (array.empty() || array[0].empty()) return false;
int m = array.size(), n = array[0].size();
int k1, k2;
for (int i = 0; i < n; i ++) if(array[0][i] <= target) k1 = i;
if(array[0][k1] == target) return true;
for (int i = 0; i < m; i ++) if(array[i][0] <= target) k2 = i;
if(array[k2][0] == target) return true;
for (int i = 0; i <= k2; i ++)
for (int j = 0; j <= k1; j ++)
if(array[i][j] == target) return true;
return false;
}
};
单调性扫描法 O( m + n m+n m+n)
最右上方
x
x
x有这一个性质:
左边的数都比
x
x
x小, 下边的数都比
x
x
x大
当
x
>
t
a
r
g
e
t
x > target
x>target 时
x
x
x 下方的数字都比
t
a
r
g
e
t
target
target 大
j
j
j --(找更小的)
当
x
<
t
a
r
g
e
t
x<target
x<target 时
x
x
x 左边的数字都比
t
a
r
g
e
t
target
target 小
i
i
i ++(找更大的)
class Solution {
public:
bool searchArray(vector<vector<int>> array, int target) {
if (array.empty() || array[0].empty()) return false;
int i = 0, j = array[0].size()-1;
while (i < array.size() && j >= 0)
{
if (array[i][j] == target) return true;
if (array[i][j] > target) j --;
else i ++;
}
return false;
}
};
以上是关于七周打卡剑指offer《二维数组中的查找》的主要内容,如果未能解决你的问题,请参考以下文章