zoukankan      html  css  js  c++  java
  • 【剑指Offer】二维数组中的查找

    题目描述

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

    解法1

    最简单的思路,就是暴力遍历,for循环遍历数组所有元素,判断该整数是否存在。再利用题目给出的每一行递增,每一列递增的两个特点进行优化。当查找到某行的第一列的元素就已经比目标整数大了,就不用再继续进行遍历了,因为后面行的所有元素都会比目标整数大。同理,当查找到某行某列的元素已经比目标整数大了,也可以不用再遍历该列后面的所有列了,因为后面的所有列都会比目标整数大。

    实现代码

    public bool Find(int target, int[][] array)
    {
        if (array.Length > 0 && array[0].Length > 0)
        {
            int col = array[0].Length;
            for (int i = 0; i < array.Length; i++)
            {
                if (array[i][0] > target)
                {
                	// 该行后面的所有行将不再遍历
                    break;
                }
                for (int j = 0; j < col; j++)
                {
                    if (array[i][j] == target)
                    {
                        return true;
                    }
                    else if (array[i][j] > target)
                    {
                    	// 该列后面的所有列将不再遍历
                        col = j;
                        break;
                    }
                }
            }
        }
        return false;
    }
    

    需注意的问题

    这道题我在第一次提交的时候未通过,原因是忘记判断二维数组中元素为0的情况。以后需要格外留心类似这种为空或为0的特殊情况

    解法2

    我们可以通过本题二维数组每行递增,每列递增的特点,总结出相关规律,如下所示。可以发现,如果从数组的左下角或右上角观察,数组是有序的。这里以左下角为例,向右的话元素递增,向上的话元素递减。即从左下角开始查找,当目标整数比左下角数字大时右移(比目标整数大的一定在其右边),比左下角数字小时上移(比目标整数小的一定在其上面)。


    [12345246810459121389101112] left[ egin{matrix} 1 &amp; 2 &amp; 3 &amp; 4 &amp; 5\ 2 &amp; 4 &amp; 6 &amp; 8 &amp; 10 \ 4 &amp; 5 &amp; 9 &amp; 12 &amp; 13 \ 8 &amp; 9 &amp; 10 &amp; 11 &amp; 12 end{matrix} ight] 12482459369104812115101312

    实现代码

    public bool FindOptimize(int target, int[][] array)
    {
        int row = array.Length - 1;
        int col = 0;
        while(row >=0 && col < array[0].Length){
            if(array[row][col] == target)
            {
                return true;
            }else if(array[row][col] > target)
            {
                row--;
            }
            else
            {
                col++;
            }
        }
        return false;
    }

    更多题目的完整描述,AC代码,以及解题思路请参考这里https://github.com/iwiniwin/Algorithm
  • 相关阅读:
    spring使用中ModelAttribute的内容被覆盖
    html中,纯数字或纯英文的一串字符超出父容器不会折行显示,如何解决?
    js实现刷新页面出现随机背景图
    为tomcat配置项目必须的引擎文件
    mysql如何出查出最近7天,最近30天,最近n天的记录?
    为了显示此页面,Firefox 必须发送将重复此前动作的数据(例如搜索或者下订单)
    git 恢复到旧版本命令
    七大经典排序算法总结(C语言描述)
    C语言描述栈的实现及操作(链表实现)
    C语言的文件读写操作函数小结
  • 原文地址:https://www.cnblogs.com/iwiniwin/p/10793658.html
Copyright © 2011-2022 走看看