java二维数组查找

java二维数组查找问题:在一个二维数组中,每行每列都递增排序,在这个数组中查找一个数字,如果存在返回true,否则返回flase。分析:数组查找一直都是初学java的同学的热门考点,关于查找主要有顺序查找、二分查找、哈希表查找、二叉排序树查找。我们看下下面这个数组,数组满足每行每列都是递增顺序。在这个数组中查找某个数,如果存在,返回true和所在位置。否则返回flase。这里我们该选择什么样的方式来…

大家好,又见面了,我是你们的朋友全栈君。

问题:在一个二维数组中,每行每列都递增排序,在这个数组中查找一个数字,如果存在返回true,否则返回flase。

分析:数组查找一直都是初学java的同学的热门考点,关于查找主要有顺序查找、二分查找、哈希表查找、二叉排序树查找。

我们看下下面这个数组,数组满足每行每列都是递增顺序。在这个数组中查找某个数,如果存在,返回true和所在位置。否则返回flase。

java二维数组查找

这里我们该选择什么样的方式来查找呢,首先排除顺序查找,顺序查找是大部分人都应该会的,这里不需要做太多介绍。

然后通过数组特性分析,一个排序好的数组,我们首先考虑二分法,如果数组中选取的数字和要查找的数字相等时,查找结束。如果选取的数字大于要查找的数字。那么根据数组要求,所查找数字位于选取数字的左边和上边(图)。反之就是在右边或下边(图2)

java二维数组查找    java二维数组查找

可以看到,这样方法中,由于要查找的数字相对于当前选取的位置有可能在两个区域中出现,而且这两个区域还有重叠的部分,这样问题看起来就复杂了,于是很多人卡住这里束手无策。为什么会遇到这种难题呢,是因为我们选取的数是二维数组中间的数字。如果我们从数组的一个角上来选取一个数会不会变得简单点呢?还是上图的例子。我们来看一下。首先我们选取数组右上角的9,有三种情况:
    1)要查找的数等于9,查找结束。

    2) 要查找的数字大于9,那么9所在的这一行就可以排除了,因为从这个数组的特征可以看到9就是这一行的最大数。最大数都小于要查找的数字,那这一行当然不可能等于要查找的数。所查找的数字在剩下的区域(图3)。

    3)要查找的数小于9,那么9所在的这一列可以排除,因为9所在这一列中9是最小的数字。同理,查找的数字在剩下的区域(图4)。

java二维数组查找java二维数组查找

通过上一步。我们可以得到一个新的4×3或者3×4的数组。对新的数组继续执行上述步骤。直到数组变为0x0。即表明数组中没有我们要查找的数字。以上就是我们的思路。具体代码实现如下:

package array;
public class FindInPartiallySortedMatrix {
    private int row, col;
    private boolean isFind;
    public FindInPartiallySortedMatrix Find(int[][] a,int find){
        int rows = a.length-1,cols = a[0].length-1,firstrows = 0;
        if(rows<=0||cols<=0){
            System.out.println("数组为空,无任何数据");
        }
        else{
            isFind = false;
            while (firstrows<=rows&&cols>=0){
                if(a[firstrows][cols]>find){
                    --cols;
                }
                else if(a[firstrows][cols]<find){
                    ++firstrows;
                }
                else {
                    this.row = firstrows;
                    this.col = cols;
                    this.isFind = true;
                    break;
                }
            }
        }
            System.out.println(this.isFind + " " + this.row + " " + this.col);
        return this;
    }
  public static void main(String[] args){
      int[][] a ={
  
  {1,2,8,4},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
      FindInPartiallySortedMatrix finds = new FindInPartiallySortedMatrix();
      finds.Find(a,1);
      finds.Find(a,7);
      finds.Find(a,13);
      finds.Find(a,15);
      finds.Find(a,3);
      //System.out.println(finds.isFind+" "+finds.row+" "+finds.col);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/138945.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月30日 下午4:16
下一篇 2022年5月30日 下午4:16


相关推荐

  • vss配置beyond compare「建议收藏」

    UsingBeyondComparewithVersionControlSystems
    BeyondComparecanbeconfiguredastheexternaldifferenceutilityinmanypopularVCSapplications. Thefollowingareconfigurationinstructionsforspecificproducts. Letusknowifyouhave

    2022年4月13日
    75
  • 计算机odbc数据源管理位置,使用 ODBC 数据源管理器

    计算机odbc数据源管理位置,使用 ODBC 数据源管理器若要配置 MicrosoftSQL 数据源 请使用 ODBC 数据源管理器 可以通过在 控制面板 中单击 数据源 ODBC 来启动 ODBC 数据源管理器 使用 ODBC 数据源管理器可以 显示系统当前安装的 SQLServerODB 驱动程序的版本信息 添加 更改和删除 SQLServerODB 驱动程序的数据源 ODBC 数据源管理器还可以为用

    2026年3月19日
    3
  • 详解自动化运维平台的构建过程[通俗易懂]

    详解自动化运维平台的构建过程[通俗易懂]2013年,我加入了聚美优品,当时成都团队仅有四五个人,负责一些辅助系统的日常运维,比如查查日志等。随着公司规模逐渐的扩大,一些重要的业务往成都迁移,这对成都团队是一个非常大的挑战。业务部署最开始是手工的,我们逐渐觉得应该有一个平台来满足我们的工作,所以我们打造了一个运维平台。本文将围绕平台里有关自动化的东西做一个介绍,当然我们是一个小团队,不足的地方请大家指正。传统运维带来的坑说到运维自动化,前…

    2022年5月17日
    67
  • pycharm使用anaconda环境可以直接导入包吗_anaconda pycharm环境配置

    pycharm使用anaconda环境可以直接导入包吗_anaconda pycharm环境配置PyCharm使用Anaconda环境使用pycharm进行python脚本开发,特别是进行科学计算时,需要引入大量的第三方脚本,此时如果每次都需要去逐一下载,无疑浪费了许多时间。这时可以使用Anaconda来快速的搭建一个开发环境什么是AnacondaAnaconda(官方网站)就是可以便捷获取包且对包能够进行管理,同时对环境可以统一管理的发行版本。Anaconda包含了conda、Python在内的超过180个科学包及其依赖项。上图为Anaconda完成安装之后的页面,可以看到右侧已经

    2022年8月29日
    3
  • Linux-lrzsz命令[通俗易懂]

    Linux-lrzsz命令[通俗易懂]Linuxlrzsz命令的使用和背后原理探究当我们利用Xshell对Linux服务器进行操作时,常常苦恼本地和服务器之间互相传文件的问题,即使有如Winscp这样的工具,但是当在服务器上使用虚拟机的时候,配置FTP就显得比较麻烦了,因此有Lrzsz这样的工具能够帮助我们上传下载一些体量不是很大的文件。安装LRZSZsudoapt-getinstalllrzsz如果不是Ubuntu…

    2022年6月23日
    41
  • TCP 协议(包含三次握手,四次挥手)[通俗易懂]

    TCP 协议(包含三次握手,四次挥手)[通俗易懂]TCP特性1.确认应答(可靠传输的最核心机制)1.确认应答(可靠传输的最核心机制)可靠传输的最核心机制

    2022年5月5日
    67

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号