4. 二维数组中的查找

有些话、适合烂在心里 提交于 2019-12-30 01:12:05

题目

给定一个二维数组,其每一行从左到右递增排序,从上到下也是递增排序。给定一个数,判断这个数是否在该二维数组中
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.

解题思路

  • 因为此二维数组的特性,发现可以选取某一个坐标作为参考点进行遍历查询,当查找的数字大于当前选取的位置,则可以从其右边或者下边开始找,如图
    在这里插入图片描述
  • 但是发现会需要进行多次的判断,不仅得往旁边进行遍历,而且也需要往下边进行遍历,但是会发现变得很复杂
进一步分析
  • 根据此二位数组的特殊性,可以发现,当我们选取右上角的值作为我们的参考点的话,所需要判断的次数会少很多,当一个数值大于此坐标值的话,结果只有一种,那就是在这个坐标的下面,当一个数值小于此坐标值的话,结果也仅有一种,那就是在这个坐标的左边,跟刚开始的方法相比,这就大大的减少了需要对比的次数。不仅如此,我们也可以选取左下角的值作为选取点,效果一致。
代码
public class Solution {
    public boolean Find(int target, int [][] array) {
        //行数
        int rows = array.length;
        //列数
        int cols = array[0].length;
        int r = 0;
        int c = cols - 1;
        //此时的r c的坐标就是右上角的坐标
        while(r <= rows - 1 && c >= 0){
            if(target == array[r][c]){
                return true;
            }else if(target > array[r][c]){
                //大于  则往下开始找
                r++;
            }else{
                //小于  则往左边开始找
                c--;
            }
        }
        return false;
    }
}
暴力解法
  • 挨个挨个找,遍历二维数组
public class Solution {
    public boolean Find(int target, int [][] array) {
        //行数
        int rows = array.length;
        //列数
        int cols = array[0].length;
         for(int i=0;i < rows;i++){
             for(int j = 0;j < cols;j++){
                 if(array[i][j] == target){
                     return true;
                 }
             }
         }
        return false;
    }
}
参考文献

CS-Notes
何海涛. 剑指 Offer[M]. 电子工业出版社, 2012.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!