[编程题]二维数组中的查找

二维数组中的查找

https://www.nowcoder.com/questionTerminal/abc3fe2ce8e146608e868a70efebf62e?answerType=1&f=discussion

二维数组中的查找

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

分析:

  • 同一行中元素从小到大排列;
  • 同一列中元素从小到大排列;

方法1:暴力解法

public class Solution {
    public static boolean Find(int target, int [][] array) {
        if(array == null || array.length == 0 || array[0].length == 0)
            return false;

        int len1 = array.length;
        int len2 = array[0].length;
        for(int i = 0; i < len1; i++) {
            for(int j = 0; j < len2; j++){
                    if(array[i][j] == target)
                        return true;
                }
        }    
        return false;
    }

方法2:遍历每行进行二分查找

public class Solution {
    public static boolean Find(int target, int [][] array) {
        if(array == null || array.length == 0 || array[0].length == 0)
            return false;

        int len1 = array.length;
        int len2 = array[0].length;
        for(int i = 0; i < len1; i++) {
            if(target == array[i][0] || target == array[i][len2 - 1])
                return true;
            else if(target < array[i][0])
                return false;
            else if(target > array[i][len2 - 1])
                continue;
            else {
                if(binaryFind(array[i], target))
                    return true;
            }
        }

        return false;
    }

    public static boolean binaryFind(int[] arr, int target) {
        int l = 0;
        int r = arr.length - 1;
        while(l <= r) {
            int mid = l + (r - l) / 2;
            if(arr[mid] == target)
                return true;
            else if(arr[mid] > target)
                r = mid - 1;
            else
                l = mid + 1;
        }
        return false;
    }
}

方法3:从左下角开始查找

左下角元素m是行中最小的,是一列中最大的。

  • 当m == target时,查到结果,直接返回;
  • 当m > target时,因为m是一行中最小的,所以向上移动一行,继续查找;
  • 当m < target时,因为m是一列中最大的,所以向右移动一列,继续查找。
public class Solution {
        public static boolean Find(int target, int [][] array) {
        if(array == null || array.length == 0 || array[0].length == 0)
            return false;

        int len1 = array.length;
        int len2 = array[0].length;
        int i = len1 - 1;
        int j = 0;
        while(i >= 0 && j < len2) {
            int m = array[i][j];
            if(m == target)
                return true;
            else if(m > target)
                i--;
            else
                j++;
        }

        return false;
    }
}

方法4:从右上角开始查找

右上角元素是一行中最大的,是一列中最小的。

  • 当m == target时,找到结果直接返回;
  • 当m > target时,因为m是一列中最小的,所以向左移动一列,继续查找;
  • 当m < target时,因为m是一行中最大的,所以想下移动一行,继续查找。
public class Solution {
        public static boolean Find(int target, int [][] array) {
        if(array == null || array.length == 0 || array[0].length == 0)
            return false;

        int len1 = array.length;
        int len2 = array[0].length;
        int i = 0;
        int j = len2 - 1;
        while(i < len1 && j >= 0) {
            int m = array[i][j];
            if(m == target)
                return true;
            else if(m > target)
                j--;
            else
                i++;
        }

        return false;
    }
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
11-26 16:06
已编辑
快手电商 后端 23k-35k
点赞 评论 收藏
分享
10-05 11:11
海南大学 Java
投票
理想江南137:感觉挺真诚的 感觉可以试一试
点赞 评论 收藏
分享
秋招进行到现在终于能写总结了。完全没想到战线会拉这么长,过程会如此狼狈,不过更应该怪自己太菜了。好在所有的运气都用在了最后,也是有个去处。背景:双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满满
点赞 评论 收藏
分享
评论
4
收藏
分享
牛客网
牛客企业服务