剑指Offer经典算法题-二维数组中的查找

题目描述

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
 
方法一、穷举法"暴力破解"
依次遍历数组中每个元素,一一比对
public class Solution {
    public boolean Find(int target, int [][] array) {
        for(int i =0;i<array.length;i++){
            for(int j=0;j<array[i].length;j++){
                if(array[i][j]==target){
                    return true;
                }
            }
        }
        return false;
    }
}

 

方法二、从左下角出发,遍历

分析该二维数组的特性:

每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序

从中我们不难得知,左下角的数(记为s)是首列最大的数,同时是末行最小的数

然后我们从这个数s出发,依次与目标值target做比对

1.当s<target时,因为它处于该行最小的值,要想使值变大,位置右移

2.当s>target时,因为它处于该列最大的值,要想使值减小,位置上移

……

如此循环,直至找到s=target的情况

public class Solution {
    public boolean Find(int target, int [][] array) {
        int rows = array.length;  //
        if (rows == 0){
            return false;
        }
        int cols = array[0].length;  //
        if (cols == 0){
            return false;
        }
        //将行列定位至左下角
        int row = rows -1;
        int col = 0;
        while(row >= 0 && col < cols){
            if(array[row][col] > target){
                row --;
            }else if(array[row][col] < target){
                col ++;
            }else{
                return true;
            }
            
        }
        return false;
    }
}

 

 

posted @ 2020-03-27 23:54  大西young  阅读(307)  评论(0编辑  收藏  举报