劍指Offer面試題3:二維數組的查找 Java實現

題目:二維數組的查找
在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下的順序排列。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷該數組是否含有該整數。例如在下面的二維數組中,如果查找數字7,則返回true;如果查找數字5,由於矩陣不含有該數,則返回false。
1    2    8     9
2    4    9     12
4    7    10    13
6    8    11    15

算法分析
        當我們需要解決一個複雜的問題的時候,一個很有效的方法就是從一個具體的問題入手,通過分析簡單具體的例子,試圖尋找普遍的規律。針對這個問題,我們不妨也從一個具體的例子入手。下面我們可以在題目中給出的數組中查找數字7爲例來一步步分析查找的過程。
首先我們選取數組右上角的數字9,由於9大於7,並且9還是第4列的第一個(也是最小的)數字,因此7不可能出現在數字9的所在列。於是我們把這一列從需要考慮的區域剔除,之後只需要從分析剩下的3列。在剩下的矩陣中,位於右上角的數字是8.同樣8大於7,因此8所在的列我們也剔除。接下來我們只要分析剩下的兩列即可。
在由剩餘的兩列組成的數組中,數字2位於數組的右上角。2小於7,那麼要查找的7可能在2的右邊,也有可能在2的下邊。在前面的步驟中,我們已經發現了2的右邊的列都已經被剔除了,也就是說7不可能出現在2的右邊,因此7有可能出現在2的下邊。於是我們把數字2所在的行也剔除,只分析剩下的三行兩列數字。在剩下的數字中,數字4位於右上角,和前面一樣,我們把數字4所在的行也刪除,最後剩下的兩行兩列數字。
在剩下的兩行兩列數字4個數字中,位於右上角的剛好就是我們要查找的數字7,於是查找就可以結束了。
 
 
        總結上述的查找過程,我們發現瞭如下規律:首先選取數組中右上角的數字。如果該數字等於要查找的數字,查找過程結束;如果該數字大於要查找的數字,剔除這個數字所在的列;如果該數字小於要查找的數字,剔除這個數字所在的行。也就是說如果要查找的數字不在數組的右上角,則每一次都在數組的查找範圍中剔除一行或一列,這樣每一步都可以縮小查找的範圍,直到找到查找的數字,或者查找範圍爲空。


算法源程序:
/**************************************************************      
* Copyright (c) 2016, 
* All rights reserved.                   
* 版 本 號:v1.0                   
* 題目描述:矩陣中的路徑
* 			請設計一個函數,用來判斷在一個矩陣中是否存在一條包含某字符串所有字符的路徑。路徑可以從矩陣中任意一格開始,
* 			每一步可以在矩陣中向左右上下移動一格。如果一條路徑經過了矩陣的某一格,那麼該路徑不能再次進入該格子。
* 			例如,在下面的3x4的矩陣中包含一條字符串“bcced"的路徑。但該矩陣中不包含字符串"abcd",的路徑,
* 			因爲字符串的第一個字符b佔據了矩陣中的第一行第二個格子後,路徑不能再次進入這個格子。
*			a        b        c        e
*			s        f        c        s
*			a        d        e        e
* 輸入描述:請輸入矩陣的行數:
*			4
*			請輸入矩陣的列數:
*			4
*			4
*			請輸入一個數字矩陣,用空格隔開:
*			1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15
*			請輸入要查詢的數字k:
*			7
* 程序輸出:矩陣中是否包含該字符串:
*			true
* 問題分析:無
* 算法描述: 
* 完成日期:2016-03-03
***************************************************************/

package org.marsguo.offerproject03;

import java.util.Scanner;

class SolutionMethod1{
	public boolean FindFunction(int[] matrix,int rows,int columns,int number){
		boolean found = false;
		if(matrix == null || rows < 0 || columns < 0)
			return false;
		
		int row = 0;
		int column = columns - 1;
		while(row < rows && column > 0){
			if(matrix[row*columns + column] == number){
				found = true;
				break;
			}
			else if(matrix[row*columns + column] > number){
				--column;
			}
			else{
				++row;
			}
		}
		return found;
	}
}

public class FindNumberInMatrix {
	public static void main(String[] args){
		int rows;
		int cols;
		int k;
		Scanner scanner = new Scanner(System.in);
		System.out.println("請輸入矩陣的行數:");
		rows = scanner.nextInt();
		System.out.println("請輸入矩陣的列數:");
		cols = scanner.nextInt();
		scanner.nextLine();
		System.out.println("請輸入一個數字矩陣,用空格隔開:");
		String str =  scanner.nextLine();
		String[] tmp = str.split(" ");
		int[] arrays = new int[tmp.length];
		for(int i = 0; i < tmp.length; i++){
			arrays[i] = Integer.parseInt(tmp[i]);
		}
		System.out.println("請輸入要查詢的數字k:");
		k = scanner.nextInt();
		scanner.close();
		
		SolutionMethod1 solution1 = new SolutionMethod1();
		
		System.out.println("該矩陣中是否包含該數字:");
		System.out.println(solution1.FindFunction(arrays, rows, cols, k));
	}
}



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