剑指offer-3-二维数组中的查找-java

题目及测试

package sword003;
/*
 * 题目描述:二维数组中的查找
 * 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下的顺序排序。
 * 完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否包含该整数
 *
 */
/*
 * 1  2  8  9
 * 2  4  9  12
 * 4  7  10 13
 * 6  8  11 15
 */
public class main {
	
	public static void main(String[] args) {
		int[][] testTable = {{1,   2,  8, 9},{2,   4,  9, 12},
				{4,   7,  10, 13},{6, 8, 11, 15}};
		int[] testTable2=new int[]{5,7};
		for(int i=0;i<testTable2.length;i++){
			test(testTable,testTable2[i]);
		}
		
	}
		 
	private static void test(int[][] ito,int ito2) {
		Solution solution = new Solution();
		long begin = System.currentTimeMillis();
		System.out.println("ito= ");
		for(int i=0;i<ito.length;i++){
			for(int j=0;j<ito[i].length;j++){
			System.out.print(ito[i][j]+" ");
			}
			System.out.println();
		}
		System.out.println();
		System.out.println("ito2= "+ito2);
		boolean rtn;
		rtn=solution.find(ito,ito2);//执行程序
		long end = System.currentTimeMillis();		
		System.out.println("rtn="+rtn);
		System.out.println();
		System.out.println("耗时:" + (end - begin) + "ms");
		System.out.println("-------------------");
	}

}

解法1(成功)

从左下角,或者右上角开始,它们的两侧是一个递增和递减的状态,直接查询即可。

package sword003;




public class Solution  {
    public boolean find(int arr[][],int keyNumber){
       int rows = arr.length;
       if(rows ==0) {
    	   return false;
       }
       int cols = arr[0].length;
       if(cols ==0) {
    	   return false;
       }
       // 从左下角开始
       int i = rows-1;
       int j = 0;
       while(i >= 0 && j < cols) {
    	   int now = arr[i][j];
    	   if(now == keyNumber) {
    		   return true;
    	   }
    	   if(now>keyNumber) {
    		   i--;
    	   }else {
    		   j++;
    	   }
       }	
        return false;

    }
}
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页