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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • android离线打包[通俗易懂]

    android离线打包[通俗易懂]本文章参考官网和其他博客,如有侵权,立即删除官网地址:https://nativesupport.dcloud.net.cn/AppDocs/usesdk/android需要的工具HBuilderX链接:https://www.dcloud.io/hbuilderx.htmlAndroidStudio链接:https://developer.android.google.cn/studio/index.htmlApp离线SDK链接:https://nativesupp…

    2025年6月16日
    2
  • Spring中的注解 @RequestBody和@ResponseBody的使用和区别

    Spring中的注解 @RequestBody和@ResponseBody的使用和区别一、@RequestBody@RequestBody的作用是将前端传来的json格式的数据转为自己定义好的javabean对象如图以微信小程序为例,前端向后端传入如下json格式的数据需要注意的是传入数据的属性名称要和后端javabean中定义的一致发送请求后可以看到在控制台中我们通过javabean对象的get方法打印出了前端传来的值,说明json数据已经成功的被转换为了javab…

    2022年5月28日
    107
  • ewebeditor漏洞利用总结

    ewebeditor漏洞利用总结先从最基本的记录起!通常入侵ewebeditor编辑器的步骤如下:1、首先访问默认管理页看是否存在。       默认管理页地址2.80以前为ewebeditor/admin_login.asp以后版本为admin/login.asp(各种语言的大家自己改后缀,本文就以asp来进行说明,下面不再细说了!)2、默认管理帐号密码!       默认管理页存在!我们就用帐号密码

    2022年7月14日
    60
  • 一步步学习SPD2010–第二章节–处理SP网站(6)—- 探索SP网站「建议收藏」

    一步步学习SPD2010–第二章节–处理SP网站(6)—- 探索SP网站「建议收藏」SP技术没有一个界面;你可以通过使用Web浏览器或者兼容程序如Office应用程序,包括SPD。你可以选择适合你必须完成的任务的接口。然而,根据你选择的程序,你可能有SP网站的不同视图。如果你使用MSWord,你只看到了网站和内容的一小部分。如果你使用浏览器,你看到支持SP协同本质的列表和库,以及它们的内容。当你使用SPD时—-此产品理解最多SP基础—-你可以看到…

    2022年6月15日
    26
  • 用matlab绘制函数图像例题_matlab绘制方程组图像

    用matlab绘制函数图像例题_matlab绘制方程组图像1.一元函数比如f(x)=x+10sin(5x)+7cos(4x)%%%%%%%%%f(x)=x+10sin(5x)+7cos(4x)%%%%%%%%%%clearall;%清除所有变量closeall;%清图clc;%清屏x=0:0.01:10;y=x+10*sin(5*x)…

    2025年9月28日
    2
  • Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

    Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?今天打开centos7,由于没设置开机自启,当我启动docker时,发现与docker有关的命令都会报错,百度过,说什么重装docker啥的,我都试过,但是还是解决不了问题,下面我贴出问题集:1.例如我查看版本信息2.重启容器3.systemctlstatusdocker查看docker状态也发现错误:最后解决问题方法是:进入/etc/docker,没有daemon.json文件就自己新建一个:cd/etc/docker编辑daemon.json文件:加入这段代码:

    2022年5月29日
    26

发表回复

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

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