二维数组,每行、列升序排列,判断某整数是否在数组中

二维数组,每行、列升序排列,判断某整数是否在数组中

原题如下

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。附图片如下
二维数组,每行、列升序排列,判断某整数是否在数组中_第1张图片

解题思路

1.数组特点

二维数组;
数组为 行,列元素均为有序且递增的;
因为行列都是递增的,所以对于数组中元素来讲,有几个特定位置的元素可以利用,每行的首尾元素即[i][0],[i][length-1]

2.拆分,减少循环

要在数组中找到某个元素,离不开遍历,迎面的二维数组给我们的感觉是可能要遍历两层,依次加入数组的每一维,比较每一维的每个元素,循环 m*n 次。

拆分二维数组,无非就两层,加条件来限制循环的进入。这里,数组中特点位置元素就可以用了:若 整数大于当前行首元素且小于当前行尾元素,进循环。

3.准备代码

public class T2 {

   public static void main(String[] args){
   	int[][] numbers = {{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,14,15}};
   	
   	long start=System.currentTimeMillis();
   	System.out.println("start:"+start);
   	boolean flag = haveTheNumber(numbers,15);
   	long end=System.currentTimeMillis();
   	System.out.println("end:"+end);
   	System.out.println(flag+" time:"+(end-start));
   	
   	
   	
   }
   
   /**
    * 一个二维数组,从左到右,从上到下以递增排列
    * 完成一个函数,输入这个数组及一个整数,判断数组中是否有这个整数
    * @param number
    * @return
    */
   public static boolean haveTheNumber(int[][] numbers,int number){
   	
   	boolean flag = false;
   	int len = numbers.length;
   	for(int i=0;inumbers[i][0] && number

小结

基于有序的前提,得以加限制条件,减少循环次数,提高效率。反过来想,如果给一个多维的 无需的数组,在其中找某个元素,则先对其排序,应该是一个比较理想的优化思虑。

你可能感兴趣的:(Java)