剑指1(二维数组中的查找)

二维数组中的查找(java)

题目描述:
在一个n*m的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
限制:0 <= n <= 1000;0 <= m <= 1000

样例:
现有矩阵matrix如下:

{
   {1,   4,  7, 11, 15},
   {2,   5,  8, 12, 19},
   {3,   6,  9, 16, 22},
   {10, 13, 14, 17, 24},
   {18, 21, 23, 26, 30}
  }

给定target = 5,返回true
给定target = 20,返回false

题解:
暴力解法太暴力了,最开始的思路:(说行啊列呀的就假装他是个矩阵吧)查找第一行,找出target可能出现的列,再查找那些列。
比如target=5吧,第一行1,4,都小于5,所以target可能出现在这两列。就在这两列种进行查找(先4后1)。
想着觉得自己很对,写的时候就发现问题了,处理起来太麻烦,由于要多次在一维数组中查找,还额外写了一个二分查找的函数用来调用,后来发现二分查找找多个数处理起来有点麻烦就换成了遍历,,折腾来折腾去弄了好长,编译器弄运行出来了,力扣还不承认。跪了
然后学习了大佬的思想
选一个角开始查找,这个角必须是左下角或右上角,因为这两个角横向进行还是竖向进行是有区分的(右上角为例,横向减少,竖向增加)。
比较过程中如果大于target就横向进行排除此列,如果小于target就竖向进行排除此行。
画了个图形象点:
在这里插入图片描述

代码:
两个代码一对比,浓缩的都是精华 ,是我努力的方向。

public static boolean findNumberIn2DArray(int[][] matrix, int target) {
  if(matrix.length == 0)
   return false;
  int r = 0;
  int c = matrix[0].length - 1;
  while(r <matrix.length && c >= 0) {
   if(matrix[r][c] == target) {
    return true;
   }else if(matrix[r][c] > target) {
    c --;
   }else if(matrix[r][c] < target) {
    r ++;
   }
  }
  return false;
 }

笨的(留个纪念)

//二维数组中的查找
//太垃圾了我写的这都是些什么
 public static boolean findNumberIn2DArray(int[][] matrix, int target) {
        int rmid = binarySearch(matrix[0],target);
        boolean result = false;
        if(rmid == -1) {
         result = false;
        }else if(matrix[0][rmid] == target) {
            result = true;
        }else {
         int[] alone = new int[matrix.length];
            while(rmid >= 0){
            //循环把rmid左侧的列都查找一下
                for(int i = 0;i < matrix.length;i ++){
                //循环把rmid列的数都放进alone数组里
                    alone[i] = matrix[i][rmid];
                }
                int cmid = binarySearch(alone,target);
                if(matrix[cmid][rmid] == target){
                    result = true;
                    break;
                }
                rmid --;
            }
        }
        return result;
    }
 public static int binarySearch(int[] alone,int target) {
  int result = -1;
  if(alone[0] <= target) {
   for(int i = 1;i < alone.length;i ++) {
    if(alone[i] == target) {
     result = i;
     break;
    }else if(alone[i] > target) {
     result = i-1;
     break;
    }else if(i == alone.length-1) {
     result = i;
    }
   }
  }
  return result;
  
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值