以前都喜欢把自己的学习经历写在本地,今天听学长传授经验,决定开始写博客啦,最近在学算法,来上一道《剑指Offer》的题。🤭
JZ1 二维数据的查找
tag:数组 查找
题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
示例
7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
返回值
true
解题思路:
可以注意到我在题目描述中加粗的两点,这个二维数组从左到右,从上到下都是由小到大递增的,这里我们可以利用二分思想,以右上角为初值来分析(左下角也可自行分析)
- 我们设初值 val = array[0][4],目标 target = array[2][1] 。
- 如图,我们可以看到 val 左边的值都是比它小的,val下面的值都是比它大的,我们可以利用这一点来进行二分操作。
- 二分操作:
- 如果 val == target ,则直接返回。
- 如果 val < target , 则说明 target 在更大的位置 ,而 val 左边的元素都小于 val,所以 val 左边的元素都小于 target。我们要寻找更大的值,因此 val 下移。
- 如果 val > target , 则说明 target 在更小的位置, 而 val 下面的元素都大于 val,所以 val 下面的元素都大于 target。我们要寻找更小的值,因此 val 左移。
- 重复二分操作
代码部分:
/**
* @author baskbull
* @since 2020-11-21
*/
public class Solution {
public boolean Find(int target, int [][] array) {
int rowSize = array[0].length;
int lineSize = array.length;
int i = 0;
int j = rowSize-1;
while(i<lineSize && j>=0){
if (target == array[i][j]){
return true;
}
else if(target > array[i][j]){
++i;
}
else {
--j;
}
}
return false;
}
}
这种算法的时间复杂度为 O(array.length + array[0].length)
最坏的情况下,需要遍历 行数+列数次
方法还有许多,期待大家的补充啦😄