4. 二维数组中的查找[java]
题目描述 在线编程
给定一个二维数组,其每一行从左到右递增排序,从上到下也是递增排序。给定一个数,判断这个数是否在该二维数组中。
Consider the following matrix: [ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30] ] Given target = 5, return true. Given target = 20, return false.
解题思路
时间复杂度 O(M + N),空间复杂度 O(1)
若逐行或逐列用二分法遍历,效率太慢了,我们希望可以以对角线的方向去遍历,
对角线方向有4种:
1. 从左上角向右下角出发:往左往下的数都是比当前大的,不可用二分法,放弃;
2.从右上角向左下角出发: 往左的数变小,往下的数增大,可用二分法;
3.从左下角向右上角出发:往上的数变小,往右的数增大,可用二分法;
4.从右下角向左上角出发:往上的数变小,往左的数变小,不可用二分法,放弃;
我们来实现第3种方法,第2种留给读者实现
public class Solution { public boolean Find(int target, int [][] array) { int rows=array.length,cols=array[0].length; int c=0,r=rows-1; while(r>=0&&c<=cols-1){ if(array[r][c]==target){ return true; } if(array[r][c]>target) r--; else c++; } return false; } }