在一個二維數組中(每一個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。html
最簡單的思路,就是暴力遍歷,for循環遍歷數組全部元素,判斷該整數是否存在。再利用題目給出的每一行遞增,每一列遞增的兩個特色進行優化。當查找到某行的第一列的元素就已經比目標整數大了,就不用再繼續進行遍歷了,由於後面行的全部元素都會比目標整數大。同理,當查找到某行某列的元素已經比目標整數大了,也能夠不用再遍歷該列後面的全部列了,由於後面的全部列都會比目標整數大。數組
public bool Find(int target, int[][] array) { if (array.Length > 0 && array[0].Length > 0) { int col = array[0].Length; for (int i = 0; i < array.Length; i++) { if (array[i][0] > target) { // 該行後面的全部行將再也不遍歷 break; } for (int j = 0; j < col; j++) { if (array[i][j] == target) { return true; } else if (array[i][j] > target) { // 該列後面的全部列將再也不遍歷 col = j; break; } } } } return false; }
這道題我在第一次提交的時候未經過,緣由是忘記判斷二維數組中元素爲0的狀況。之後須要格外留心相似這種爲空或爲0的特殊狀況函數
咱們能夠經過本題二維數組每行遞增,每列遞增的特色,總結出相關規律,以下所示。能夠發現,若是從數組的左下角或右上角觀察,數組是有序的。這裏以左下角爲例,向右的話元素遞增,向上的話元素遞減。即從左下角開始查找,當目標整數比左下角數字大時右移(比目標整數大的必定在其右邊),比左下角數字小時上移(比目標整數小的必定在其上面)。
[12345246810459121389101112] \left[ \begin{matrix} 1 & 2 & 3 & 4 & 5\\ 2 & 4 & 6 & 8 & 10 \\ 4 & 5 & 9 & 12 & 13 \\ 8 & 9 & 10 & 11 & 12 \end{matrix} \right] ⎣⎢⎢⎡12482459369104812115101312⎦⎥⎥⎤優化
public bool FindOptimize(int target, int[][] array) { int row = array.Length - 1; int col = 0; while(row >=0 && col < array[0].Length){ if(array[row][col] == target) { return true; }else if(array[row][col] > target) { row--; } else { col++; } } return false; }