剑指offer_01_二维数组中的查找

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,
每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路
该二维数组中的一个数,他左边的数都比他小,下边的数都比他大。因此,可以从右上角开始查找,根据target与数组中元素的关系来缩小查找区间,当前元素的查找区间为该元素左下角的所有元素。
假设数组为
array[4][4]={1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16};
target=14;
那么数组左上角元素为array[0][3]=4,查找过程如下图所示

  1. 将array[0][3]与target比较,4小于14,则行标 r增加1
    图片说明
  2. 将array[1][3]与target比较,8小于14,则行标 r再增加1
    图片说明
  3. 将array[2][3]与target比较,12小于14,则行标 r继续增加1
    图片说明
  4. 将array[3][3]与target比较,16大于14,则列标 c减小1
    图片说明
  5. 将array[3][2]与target比较,15大于14,则行标 c继续减1
    图片说明
  6. 将array[3][1]与target比较,14等于14,说明已在array中找到target,返回true
    图片说明
  7. 如果从数组右上角查找到左下角都没有找到target,则说明数组中不存在要查找的target,返回false

Java代码实现如下

public static boolean Find(int target, int[][] array) {
    if (array == null)
        return false;
    // 判断输入是否为空,如果为空则直接返回false
    int row = array.length, cols = array[0].length;
    // 数组行数为row,列数为cols
    int r = 0, c = cols - 1;
    // c=cols-1,列标最大值为列数减1
    while (r <= row - 1 && c >= 0) {
        // 当满足行标小于行数减1 ,并且列标大于等于0的条件时,进行查找
        if (target == array[r][c])
        return true;
        // 如果该元素与target相等,返回true
        else if (target > array[r][c])
        r++;
        // 如果target大于数组元素,则将其和该元素下方元素进行比较
        else
        c--;
        // 如果target小于数组元素,则将其和该元素左边元素进行比较
    }
    return false;
    // 如果没有找到,返回false
    }

测试结果如下:
图片说明

全部评论

相关推荐

11-26 22:34
已编辑
重庆邮电大学 Java
快手 客户端开发 (n+5)k*16 公积金12
牛客895077908号:佬 什么双非硕啊
点赞 评论 收藏
分享
10-06 12:46
门头沟学院 Java
跨考小白:定时任务启动
点赞 评论 收藏
分享
尊尼获获:闺蜜在哪?
点赞 评论 收藏
分享
秋招进行到现在终于能写总结了。完全没想到战线会拉这么长,过程会如此狼狈,不过更应该怪自己太菜了。好在所有的运气都用在了最后,也是有个去处。背景:双2本硕科班,无竞赛,本科一段研究所实习,硕士一段大厂暑期实习但无转正。技术栈是C++&nbsp;&amp;&nbsp;Golang,实习是客户端音视频(而且是鸿蒙端开发),简历两个C++项目一个Golang项目。主要投递岗位:后端,cpp软开,游戏服务端,测开,以及一些不拘泥于Java的岗位。从8月起总共投递123家公司,笔试数不清了,约面大约30家。offer/oc/意向:友塔游戏(第一个offer,面试体验很好,就是给钱好少南瑞继保(计算机科班点击就送(限男生),不...
乡土丁真真:佬很厉害,羡慕~虽然我还没有到校招的时候,也想讲一下自己的看法:我觉得不是CPP的问题,佬的背书双2,技术栈加了GO,有两段实习。投了123,面了30.拿到11个offer。这个数据已经很耀眼了。这不也是CPP带来的吗?当然也不止是CPP。至少来说在这个方向努力过的也会有好的结果和选择。同等学历和项目选java就会有更好的吗?我个人持疑问态度。当然CPP在方向选择上确实让人头大,但是我觉得能上岸,至于最后做什么方向,在我看来并不重要。至于CPP特殊,有岗位方向的随机性,java不是不挑方向,只是没得选而已。也希望自己以后校招的时候能offer满满
点赞 评论 收藏
分享
评论
1
1
分享
牛客网
牛客企业服务