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);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • python进阶(6)深拷贝和浅拷贝[通俗易懂]

    python进阶(6)深拷贝和浅拷贝[通俗易懂]深拷贝和浅拷贝不管对于浅拷贝、还是深拷贝,针对不可变对象str、int、tuple(有点特殊)、boolean,它的内存地址是不变的,拷贝的仅仅是值importcopya=1b=co

  • windows错误恢复如何解决_0xc0000006是什么错误

    windows错误恢复如何解决_0xc0000006是什么错误0xc0000005三种不同的情况下会发生错误常见原因修复访问错误解决方案1:停用程序的数据执行保护(DEP)解决方案2:在Windows注册表中停用AppInit_DLLs机制解决方案3:执行恶意软件扫描解决方案4:运行Windows内存诊断程序并替换任何有缺陷的RAM启动应用程序时如何解决0xc0000005错误解决方案1:更新设备驱动程序解决方案2:修复BCD文件安装Windows时出现0xc0000005错误:最佳解决方案解决方案1:删除并重新创建Windows硬盘分区解决方案2:更换有缺陷的硬件

  • DataGrid中DropDownList的动态绑定以及触发DropDownList事件

    DataGrid中DropDownList的动态绑定以及触发DropDownList事件今天在写DataGrid中DropDownList的绑定,客户需要根据值去改变价格信息,发现忘记如何写的了。虽然网上很多了,但自己还是做个笔记,以后查询方便1.ASPX页面1<asp:TemplateColumnHeaderText=”退还价格类型”>2<ItemTemplate>3<asp:DropDownListID=”ddlRe…

  • Qt学习:QLabel的用法及其程序示例

    Qt学习:QLabel的用法及其程序示例主要成员函数:1.voidsetText(QString);//设置label框内的文本. 2.voidhide();//隐藏label框. 3.voidsetBuddy(QWidget*);//把另一个部件设为label框的伙伴,方便快捷使用. 4.voidclear();//清空label框内所有内容. 5.voidsetPixmap(…

  • layoutparams方法_LAYOUT

    layoutparams方法_LAYOUT沙翁向昨天要经验;向今天要结果;向明天要动力Android开发:LayoutParams的用法LayoutParams继承于Android.View.ViewGroup.LayoutParams.    LayoutParams相当于一个Layout的信息包,它封装了Layout的位置、高、宽等信息。假设在屏幕上一块区域是由一个Layout

  • rabbitmq安装配置_阿里云rabbitmq

    rabbitmq安装配置_阿里云rabbitmqRabbitMQ是什么,浅谈RabbitMQ!

发表回复

您的电子邮箱地址不会被公开。

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