美文网首页
二维数组中的查找

二维数组中的查找

作者: BluthLeee | 来源:发表于2019-08-23 13:38 被阅读0次

    二维数组中的查找

    题目描述

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

    解题思路

    首先是仔细阅读题目,提取关键词:有序、二维数组

    解法一

    1. 分析

    遍历所有,然后比较,返回状态

    1. 代码
    public class Solution {
        public boolean Find(int target, int [][] array) {
            for(int i=0;i<array.length;i++){
                for(int j=0;j<array[0].length;j++){
                    if(array[i][j] == target){
                        return true;
                    }
                }
            }
            return false;
        }
    }
    
    1. 复杂度

    时间复杂度:O\left(n^{2}\right)
    空间复杂度:O(1)

    1. 问题

    没有考虑到有序这个明显特征,所以复杂度偏高

    解法二

    1. 分析

    利用该二维数组的性质:

    • 每一行都按照从左到右递增的顺序排序,
    • 每一列都按照从上到下递增的顺序排序

    改变个说法,即对于左下角的值 m,m 是该行最小的数,是该列最大的数

    每次将 m 和目标值 target 比较:

    • 当 m < target,由于 m 已经是该行最大的元素,想要更大只有从列考虑,取值右移一位
    • 当 m > target,由于 m 已经是该列最小的元素,想要更小只有从行考虑,取值上移一位
    • 当 m = target,找到该值,返回 true

    用某行最小或某列最大与 target 比较,每次可剔除一整行或一整列

    1. 代码
    public class Solution {
        public boolean Find(int target, int [][] array) {
            int rows=array.length;
            int columns=array[0].length;
            if(rows==0 || columns==0){
                return false;
            }
            int j=rows-1;
            int k=0;
            for(int i=0;i<rows+columns;i++){
                
                if(array[j][k]<target){
                    k++;
                    if(k>=columns){
                        return false;
                    }
                }else if(array[j][k]>target){
                    j--;
                    if(j<0){
                        return false;
                    }
                }else{
                    return true;
                }
            }
            return false;
        }
    }
    
    1. 复杂度

    时间复杂度:O\left(m+n\right)

    空间复杂度:O(1)

    总结

    1. 二维数组的length代表意义:

    对于数组a[3][4]

    • a.length:3
    • a[0].length:4
    1. 需要考虑极端情况:
    • 二维数组为空
    • j、k的值是否会超出合理范围

    参考:牛客网

    相关文章

      网友评论

          本文标题:二维数组中的查找

          本文链接:https://www.haomeiwen.com/subject/qfozsctx.html