《劍指》-二位數組中的查找-day01

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/nodjiang2014/article/details/78659816

    01.在一個二維數組中,每一行都按照從左到右遞增的順序排序, 每一列都按照從上到下遞增的順序排序

請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。  


解題思路:

     例如下面二位數組就是每行、每列都遞增排序。如果在這個數組中查找數字爲7,則返回true;如果查找數字5,由於數組中不含有該數字,則返回false;


   1   2   8    9

   2   4   9   12

   4   7  10  13

   6   8  11  15


  首先我們選取數組右上角的數字9。由於9大於7,並且9還是第4列的第一個(也是最大小的)數字,因此7不可能出現在數字9所在的列。於是我們把這一列從需要考慮的區域內提出,之後只需要分析剩下的3列。在剩下的矩陣中,位於憂傷角度的數字8.同樣8大於7,因此8所在的列我們也可以剔除。接下來我們只要分析剩下的兩列即可。

  在剩餘的兩列組成的數組中,數字2位於數組的右上角。2小於7,那麼要查找的7只有可能在2的右邊,也有可能在2的下邊。在前面的步驟中,我們已經發現2右邊的列都已經被提出了,也就是說7不可能出現在2的右邊,因此7只有可能出現在2的下邊。於是我們把數字2所在的行業剔除,只分析剩下的3行2列數字。在剩下的數字中,數字4位於右上角,和前面一樣,我們把數字4所在的行業刪除,最後剩下兩行兩列數字。

   在剩下的兩行兩列4個數字中,位於右上角的剛好就是我們要查找的數字7,於是查找過程就可以結束了。


如圖所示:


java代碼:

import java.util.Scanner;

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

	public static boolean find(int[][] arr, int rows, int columns, int number) {
		boolean flag = false;// 默認標記
		int row = 0;// 設置行
		int column = columns - 1;// 設置列
		if (arr != null && rows >= 0 && columns > 0) {
			while (row < rows && column>=0) {  
					if (number == arr[row][column]) {  //比較右上角的值,相等找到!
						flag = true;
						break;
					} else if (number < arr[row][column]) {  //如果number比右上角的小,幹掉一列
						column--;
					} else if (number > arr[row][column]) {	 //如果number比右上角的大,幹掉一行
						row++;
					} else {   
						break;      
					}
			}
		}

		if (flag == false) {
			System.out.println("抱歉沒有找到!");
		} else {
			System.out.println("找到了!位置爲:[" + row + "][" + column + "]");
		}

		return flag;
	}

	public static void main(String[] args) {
		int[][] arr = { { 1, 2, 8, 9 }, { 2, 4, 9, 12 }, { 4, 7, 10, 13 },
				{ 6, 8, 11, 15 } };
		// 打印數組
		for (int x = 0; x < arr.length; x++) {
			for (int y = 0; y < arr[x].length; y++) {
				System.out.print(arr[x][y] + " ");
			}
			System.out.println();
		}
		System.out.println("請輸入要查找的數字:");
		Scanner sc = new Scanner(System.in);
		int in = sc.nextInt();
		find(arr, 4, 4, in);

	}
}

  ——《劍指offer》筆記,僅供自己日後複習查看


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