1. 程式人生 > >一個從右向左遞增,從上到下遞增的二位資料矩陣,怎麼用演算法複雜度O(n)的演算法來查詢其中的某一個數

一個從右向左遞增,從上到下遞增的二位資料矩陣,怎麼用演算法複雜度O(n)的演算法來查詢其中的某一個數

import java.util.Scanner;

/**
 * 
 */
/**   
 * @author jueying:   
 * @version 建立時間:2018-10-21 下午04:03:54   
 * 類說明   
 */
/**
 * @author jueying
 *
 */
public class Test3 {
	
	/*
	 * 演算法入口
	 * 
	 * 一個從右向左遞增,從上到下遞增的二位資料矩陣,怎麼用演算法複雜度O(n)的演算法來查詢其中的某一個數
	 * 
	 * 思想:每次都用右上角的數來和需要查詢的數進行判斷,來排除一列或者一行,否則就查詢成功
	*/
	public static void fun(int a[][],int b,int k,int j){//a是查詢資料矩陣  b是需要查詢的數 4行  4列
		for(int i=k;i<a.length;i++){
			if(j>0&&k<a.length){
				
				if(b<a[i][j]){
					fun(a,b,k,--j);//排除最後一列  最多j次
				}else if(a[i][j]<b){
					fun(a,b,++k,j);//排除第一行  最多j次
				}else{//查詢成功//z次
					System.out.println(a[i][j]);
					System.out.println("在第"+(i+1)+"行"+" 第"+(j+1)+"列");
					System.exit(0);
				}
				
			}
			
			
			
		}
		
		
		
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int a[][]={{2,4,6,8,9},{5,7,10,11,12},{6,8,13,15,19},{15,17,19,21,22}};
		
		System.out.print("demo例子的資料\n");
		for(int i=0;i<a.length;i++){
			for(int j=0;j<a.length;j++){
				System.out.print(a[i][j]+" ");
			}
			System.out.println();
		}
		
		System.out.println("請輸入需要查詢的資料");
		Scanner sc=new Scanner(System.in);
		int b=sc.nextInt();
		
		fun(a,b,0,3);//預設從第0行最後一列開始判斷

	}

}