【笔记】二维数组中的查找

来源:互联网 发布:ubuntu格式化硬盘 编辑:程序博客网 时间:2024/06/07 23:38

题目要求:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
为了解题思路清晰,先创建一个二维数组。
array[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
第一种方法是把每一行看成是一个递增的数组,用二分法的思想判断当前值和target的值,进行比较。代码如下:

public class Solution {    public boolean Find(int target, int [][] array) {        for(int i=0;i<array.length;i++){            int low=0;            int high=array[i].length-1;            while(low<=high){                int mid=(low+high)/2;                if(target<array[i][mid]){                    high=mid-1;                }else if(target>array[i][mid]){                    low=mid+1;                }else{                    return true;                }            }        }        return false;    }}

以数组的形式进行循环,在每个数组里进行二分,判断mid值和target的值。
第二种方法是把二维数组看成矩阵形式的,选择右上角或左下角的元素。这里以右上角元素为例:

public class Solution {    public boolean Find(int target, int [][] array) {        int row=0;        int col=array[0].length-1;        while(row<=array.length-1&&col>=0){            if(target<array[row][col]){                col--;            }else if(target>array[row][col]){                row++;            }else{                return true;            }        }        return false;    }}

右上角元素定义为array[row][col],然后进行循环,如果target值小于array[row][col],就缩减列数col;如果target值大于array[row][col],就在当前行数基础上加1,循环直至target值等于array[row][col],否则跳出循环返回false。同理左下角元素。
两种方法都可以实现题中所述的算法,但从时间复杂度的角度上看,第二种方法较为简单。
仅为个人学习笔记,不喜勿喷。