剑指Offer 二维数组中的查找

来源:互联网 发布:php可以开发管理系统吗 编辑:程序博客网 时间:2024/06/12 02:57

时间限制:1秒
空间限制:32768K
热度指数:478583
本题知识点:查找
算法知识视频讲解

题目描述

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


分析:大体上有两种方法

一种是每一行都采用一次二分搜索,时间复杂度为n(log n)

另一种是利用二维数组由上到下,由左到右递增的规律,
那么选取右上角或者左下角的元素a[row][col]与target进行比较,
当target小于元素a[row][col]时,那么target必定在元素a所在行的左边,
即col--;
当target大于元素a[row][col]时,那么target必定在元素a所在列的下边,
即row++;

显然是第二种方法更为巧妙,简便,耗时少


下面AC代码:

public class Solution {    public boolean Find(int target, int [][] array) {        //先防护        if(array == null || array.length == 0){            return false;        }        //使用二分        for(int i = 0;i<array.length;i++){            int minp = 0;            int maxp = array[i].length;            if(array[i].length == 0){                continue;            }            if(target>=array[i][0] && target<=array[i][array[i].length-1]){//如果在第i行                while(maxp>=minp){                    int p = (minp+maxp)/2;//指针                    if(target == array[i][p]){                        return true;                    }else if(target < array[i][p]){                        maxp = p-1;                    }else{                        minp = p+1;                    }                }             }        }        return false;    }}

public class Solution {    public boolean Find(int target, int [][] array) {        //if(array == null || array.length == 0){          //  return false;        //}        //从右上角开始        int row = 0;//第0行        int col = array[0].length-1;//第0行 最后一个        while(row<=array.length-1 && col>=0){            if(target == array[row][col]){                return true;            }else if(target > array[row][col] ){                row++;            }else{                col--;            }        }        return false;    }}


原创粉丝点击