在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
代碼格式要求:
public class Solution { public boolean Find(int target, int [][] array) { } }
解題思路一:
最簡單直接當然就是雙重循環遍歷了,但是這樣的話,復雜度就變成了O(m*n),並且題目的條件完全沒有用到。
public boolean Find(int target, int [][] array) { if(array.length == 0){ return false; } for(int[] row : array){ for(int value : row){ if(value == target) { return true; } } } return false; }
解題思路二:
整個二維數組可以看成是一個有序的矩陣,我們從左下角開始遍歷,不斷利用有序性縮小矩陣的范圍,就可以找到了。
舉個例子:
1 3 5 7 9
2 4 6 8 10
4 9 12 14 16
比如說我們現在要找8這個數
8 > 4 , 元素右移 (此時我們可以知道4上面的元素都不是我們要找的),矩陣就變成了這樣。
1 3 5 7 9
2 4 6 8 10
4 9 12 14 16
8 < 9 元素上移 (9后面的元素全部都不再搜索范圍內了),矩陣再次變換。
1 3 5 7 9
2 4 6 8 10
4 9 12 14 16
就這樣不斷縮小整個矩陣的范圍我們就可以找到相應的元素了,當然也有可能找不到,需要自己設置邊界條件
完整代碼如下:
public class Solution { public boolean Find(int target, int [][] array) { if(array.length == 0){ return false; } int rowLength = array.length; //總行數 int columnsLength = array[0].length; //總列數 int curRow = rowLength - 1; //當前行,初始值為最后一行 int curColumns = 0; //當前列 while(curRow >= 0 && curColumns < columnsLength) { if(target == array[curRow][curColumns]) { return true;} else if( target > array[curRow][curColumns]) { curColumns ++; //右移 } else{ curRow --; //上移 } } return false; } }
