剑指offer——第一题
【第一天】打算以后每天做几道算法题,希望能找到一个好的实习 加油💪
【题目】在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
【背景知识】二位数组中的查找
【思路】算法题嘛,先来看看用暴力能不能解决,再去考虑取巧的问题,刚开始还是一步一步来吧!
【思路一】暴力法:既然是一个二维数组,那我就去遍历它即可,遍历的时候判断一下是否含有这个整 数,有的话就返回,没有的话就继续,OK,问题迎刃而解,代码如下:
function Find(target, array) {
for (let row = 0; row < array.length; row++) {
for (let col = 0; col < array[row].length; col++) {
if (array[row][col] == target) {
return true
}
}
}
return false
}
【思路二】找规律:倘若按照思路一的解法,那么题目中的很多话就是废话,现在我们重点就来看那些 被我们忽略掉的话,题目中说每一行都按照从左到右递增的顺序排序,每一列都按照从上到 下递增的顺序排序,我们先自己构建一个这样的数组:
1 2 3 4
5 6 7 8
6 7 8 9
我们可以利用此性质,观察数组的左上、左下、右上和右下这样的特殊值,我们会发现右上和左下的这两个值是有利于我们做一些判断的,因为往两个方向的值要么比自己大,要么比自己小,方便做取舍,所以我们优先取这两个值,这里我们就取左下的这个值做说明。
假设我们现在查找的是3这个数,则
- 6 > 3 我们往上移动行的值;
- 5 > 3 我们往上移动行的值;
- 1 < 3 我们往做移动列的值;
- 2 < 3 我们往做移动列的值;
- 3 = 3 得到目标值
现在我们定义数组的行数为row,列数为col,目标值为target,数组为array,那么数组左下角的数为array[row-1][0]
,则
-
array[row-1] [0] > target 另 array[row-1-1] [0]
1.1 array[row-1-1] [0] < target 另 array[row-1-1] [0+1]
…
-
array[row-1] [0] < target 另 array[row-1] [0+1]
2.1 array[row-1] [0+1] > target 另 array[row-1-1] [0+1]
…
具体代码如下:
function Find(target, array) {
// 定义左下角数组的行的下标
let row = array.length - 1;
// 定义左下角数组的列的下标
let col = 0;
// 定义数组的列数
const count = array[0].length;
// 当检测值行的下标大于等于0且列的下标小于数组总列数时进循环
while (row >= 0 && col < count) {
// 当检测值等于目标值时 返回真
if (array[row][col] == target) {
return true;
} else if (array[row][col] > target) {
//当检测值大于目标值时 检测值往上移动,即行的下标减一
row--;
} else {
//当检测值小于目标值时 检测值往右移动,即列的下标加一
col++;
}
}
// 退出循环时还未找到目标值返回假
return false;
}