[オファー] [安全性の問題を証明するために、顔3:2次元配列を探し]

「安全オファーを証明」リスト


一つ、タイトル説明

二次元アレイ、昇順に上から下に各列を並べ替えるために、ソート昇順の順に左から右へ行ごとに。完全な機能は、そのような二次元アレイと整数を入力し、配列の整数が含まれているか否かが判断されます。

第二に、問題解決のためのアイデア

その説明では、各列が昇順に上から下に順序付けられている場合、各行は左から右に昇順にソート。各行及び各列の両方がソートされます。配列内の要素のために二分法は間違いなく、より良いアルゴリズムであると、ソートされました。私はこの線要素の最初の要素は、あなたが検索したい要素よりも大きい場合は、この行の要素を見つける必要がないので、各ラインを見つけることが第一号でした。それは要素そのバイナリ検索を使用するよりも少ない場合は。

第三に、コード説明

package com.acm.Secondmonth;

public class Test03 {
	
	/**
	 * 二分查找 
	 * 首先从列开始  只要比该列的第一个元素大,就表示可以搜索这一行
	 * 
	 * @param matrix
	 * @param i
	 * @return
	 */
	private static boolean find(int[][] matrix, int k) {
		if(matrix == null) {
			throw new RuntimeException("invaild input! the array is null!");
		}
		for(int i=0 ; i<matrix.length ; i++) {
			if(matrix[i][0] < k) {
				if(binarySearch(matrix[i] , k)) {
					return true;
				}
			}else if(matrix[i][0] == k) {
				return true;
			}
		}
		
		return false;
	}

	public static boolean binarySearch(int[] num , int k) {
		
		int start =0 , end = num.length-1;
		while(start <= end) {
			int mid = (end+start)/2;
			if(num[mid] > k) {
				end = mid-1;
			}else if(num[mid] < k) {
				start = mid+1;
			}else {
				return true;
			}
		}
		return false;
	}
	public static void main(String[] args) {
        int[][] matrix = {
                {1, 2, 8, 9},
                {2, 4, 9, 12},
                {4, 7, 10, 13},
                {6, 8, 11, 15}
        };
        System.out.println(find(matrix, 7));    // 要查找的数在数组中
        System.out.println(find(matrix, 5));    // 要查找的数不在数组中
        System.out.println(find(matrix, 1));    // 要查找的数是数组中最小的数字
        System.out.println(find(matrix, 15));   // 要查找的数是数组中最大的数字
        System.out.println(find(matrix, 0));    // 要查找的数比数组中最小的数字还小
        System.out.println(find(matrix, 16));   // 要查找的数比数组中最大的数字还大
        System.out.println(find(null, 16));     // 健壮性测试,输入空指针
    }


}

 

公開された14元の記事 ウォンの賞賛1 ビュー5524

おすすめ

転載: blog.csdn.net/Vpn_zc/article/details/84295613