剑指offer在线编程——二维数组查找       

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

思考题目所述二维数组最大的特点就是每一行递增,每一列也是递增的。考虑到这个特点,我们采取从二维数组左下角或右上角开始遍历,这样如果比目标值小,则右移,若比目标值大,则下移。

代码解答:           

public class Solution {
  public boolean Find(int [][] array,int target) {
    int rowLength = array.length;  //二维数组的行宽
    boolean isFind=false;  //查找状态
    if(array !=null && array[0].length!=0){  //判断数组是否为空,边界判断
      for(int row=rowLength-1;row>=0;row--){  //从二维数组左下角开始遍历
        if(array[row][0]<=target){    //如果目标值大,则右移
          for(int col=0;col<array[row].length;col++){
            if(target == array[row][col]){
              isFind =true;
              return isFind;
            }

          }
        }
      }
    }
    return isFind;
  }
}

上面方法比较复杂,下面介绍一种二分查找的解法,是采用别人的:

public class Solution {
    public boolean Find(int [][] array,int target) {        
        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])
                    low=mid+1;
                else if(target<array[i][mid])
                    high=mid-1;
                else
                    return true;
            }
        }
        return false;
    }
}

下面是第三种解法:

public class Solution {
  public bool Find(vector<vector<int> > array,int target) {
      int m,n,x,y;
      m = array.size();//行数
      n = array[0].size();//列数
      x=m-1;y=0;//坐标定在左下角
      while(x>=0 && y<=n-1){
        if(target<array[x][y]){
           x--;//遇小上移
        }
        else if(target>array[x][y]){
           y++;//遇大右移
        }
        else {
           return true;
        }
      }
      return false;
    }
}
posted on 2016-10-30 12:06  看一场塞北的雪  阅读(151)  评论(0)    收藏  举报