假設給定一個有序二維數組,每一行都是從左到右遞增,每一列都是從上到下遞增,如何完成一個函數,輸入這樣一個二維數組和一個整數,判斷這個整數是否在這個二維數組中。
假設一個4×4的有序二維數組:
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
要找的數字為6。
演算法的核心思想是,先取最左上角的數字9,因為9比6大,所以可以排除比9大的數字,也就是第四列,然後取8,同理排除第三列,再取2,比6小,可排除比2小的數字,也就是第一行,同理取4,排除第二行,取7,排除第二列,取4,排除第三行,取6,相等,返回true。
這裡我們用遞歸實現,程式碼為:
複製代碼代碼如下:
public class FindMatrixNumber {
private static FindMatrixNumber instance;
private static boolean found = false;
public static FindMatrixNumber getInstance() {
if (instance == null) {
instance = new FindMatrixNumber();
}
return instance;
}
public static boolean find(int matrix[][], int number) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return false;
} else {
System.out.println("****Start finding****");
findMatrixNumber(matrix, matrix.length, 0, matrix[0].length,
number);
System.out.println("*****End finding*****");
}
return found;
}
private static void findMatrixNumber(int matrix[][], int rows, int row,
int columns, int number) {
if (row > rows - 1)
return;
int cornerNumber = matrix[row][columns - 1];
System.out.println(cornerNumber);
if (cornerNumber == number) {
found = true;
return;
} else if (cornerNumber < number) {
findMatrixNumber(matrix, rows, ++row, columns, number);
} else if (cornerNumber > number) {
findMatrixNumber(matrix, rows, row, --columns, number);
}
}
}
測試程式碼為:
複製代碼代碼如下:
public class TestFindMatrixNumber {
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(FindMatrixNumber.find(matrix, 6));
}
}
測試程式碼運行結果為:
複製代碼代碼如下:
****Start finding****
9
8
2
4
7
4
6
*****End finding*****
true