【劍指offer】【面試題3 :二維數組中的查找】

《劍指Offer》總目錄


一、題目描述

在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。

二、解題思路

如題描述,每一列都按照從上到下遞增的順序排序,每一行都按照從左到右遞增的順序排序。既每一行和每一列都是排序的。針對排序的元素數組中,用二分法無疑是比較好的算法。我是先查找每一行,如果這一行元素的第一個元素比要查找的元素大,就沒有必要再查找這一行的元素。如果比它小,就使用二分法查找該元素。

三、代碼描述

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));     // 健壯性測試,輸入空指針
    }


}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章