剑指offer 面试题04. 二维数组中的查找

题目描述

   在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

            

 

解法1:暴力暴力暴力:双层暴力     结果也能过

class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        // 第一个:二维遍历查询
        if(matrix.length==0)
         return false;

        boolean res=false;
        for(int i=0;i<matrix.length;i++){
            for(int j=0;j<matrix[0].length;j++){
                if(matrix[i][j]==target){
                    res = true;
                    break;
                }
            }
            if(res==true){
                break;
            }
        }
        return res;
    }
}

解法2:解法1没有利用到每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序的特性。

  第一感觉:左上角到右下角,也感觉不出什么。 换成右上角到左下角,比当前值小,列-1,比当前值大,行+1.最后能找到target。如果数组越界还没有找到,那么数组中不存在target。

  若数组为空,返回 false

  初始化行下标为 0,列下标为二维数组的列数减 1 

  • 若数组为空,返回 false
  • 初始化行下标为 0,列下标为二维数组的列数减 1
  • 重复下列步骤,直到行下标或列下标超出边界
  1. 获得当前下标位置的元素 num
  2. 如果 num 和 target 相等,返回 true
  3. 如果 num 大于 target,列下标减 1
  4. 如果 num 小于 target,行下标加 1
  • 循环体执行完毕仍未找到元素等于 target ,说明不存在这样的元素,返回 false`
class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        if(matrix == null || matrix.length == 0){
            return false;
        }
        int row=0,cloum=matrix[0].length-1;
        while(row<matrix.length && cloum>=0){
            if(target==matrix[row][cloum]){
                return true;
            }
           else if(target<matrix[row][cloum]){
                cloum--;
           }
           else row++;
        }
       return false;
    }
}

 

posted on 2020-06-10 23:25  小轩窗~  阅读(200)  评论(0编辑  收藏  举报