编程练习二维数组 java

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


public class Solution {

    private static final int CANNOT_FIND_FLAG=-1;
    /*
    思路,先找出二维数组每一行第一个数字,与target比较,
    如果比target大,那么就不参与比较,如果比target小,那么比较该行最后一个数字,如果比target小,那么不参与比较,
    如果比target大,那么将这这行的序号记录在subArray中。

    最终subArray中存储的这些行与target比较大小,使用二分法比较。
    */
    public boolean Find(int target, int [][] array) {
      //targetNum标记是否存在target值。
      boolean targetNum=false;
      if(array.length>0){
          //subArray,可能存在target的数组的所在行序号
          int subArray[]=new int[array.length];
          int subArrayIndex=0;
          //得到一系列可能存在target的行号,放入subArray中。
          for(int i=0;i<array.length;i++){
              if(array[i].length>0&&array[i][0]<=target){
                  if(array[i][(array[i].length-1)]>=target){
                      subArray[subArrayIndex]=i;
                      subArrayIndex++;
                  }
              }
          }

          //计算subArray中对应的每一行数据,看是否存在target。
          for(int i=0;i<subArrayIndex;i++){
              int arrayNum=subArray[i];
              targetNum=findInArray(target,array[arrayNum]);
              //如果存在,直接返回true,不存在,继续查找。
              if(targetNum==true)return true;
          }
          return targetNum;
      }else{
          return false;
      }
    }

    /*
    二分法比较每行数组与target大小,如果存在target一样大小的,返回true
    如果不存在,返回false
    */
    private boolean findInArray(int target,int [] array){
        if(array.length<=0)return false;
        //二分法
        if(array[array.length-1]!=target&&array[0]!=target){
            int matchBegin=0;
            int matchEnd=array.length-1;
            int matchMid=0;
            while(matchBegin<=matchEnd){
                matchMid=(matchBegin+matchEnd)/2;

                if(array[matchBegin]==target||array[matchEnd]==target){
                    return true;
                }else {
                    if(matchMid==matchBegin||matchMid==matchEnd)
                        return false;
                }

                if(array[matchMid]>target){
                    matchEnd=matchMid;
                }else if(array[matchMid]<target){
                    matchBegin=matchMid;
                }else{
                    return true;
                }


            }
            return false;
        }else{
            return true;
        }
    }
}

以上是我的版本,但是不是最优的,因为题中给出的是“每一列都按照从上到下递增的顺序排序”,说明可以用更好的办法
如下:



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; 
    }
};

  左下角开始,遇大右移,遇小上移,直到超过边界都没找到,得false。否则得true
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值