版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 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》筆記,僅供自己日後複習查看