使用.NET 6開發TodoList應用之引入資料儲存的思路詳解
阿新 • • 發佈:2021-12-24
劍指 Offer 04. 二維陣列中的查詢
一個比較簡單的辦法就是直接遍歷這個二維陣列,但是這樣的辦法效率比較低,並沒有用到題目中提到的行列都是遞增的條件。
class Solution { public boolean findNumberIn2DArray(int[][] matrix, int target) { int n = matrix.length; if(n == 0) { return false; } int m = matrix[0].length; for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { if(matrix[i][j] == target) { return true; } } } return false; } }
上述演算法的時間複雜度為\(O(m \times n)\),空間複雜度為\(O(1)\)。
下面我們考慮如何用到給定的有序條件,可以想出,對我們需要找到一個能夠讓我們二分的位置,再考慮如何將二維陣列扁平化。
可以看出,對於每一行至其右上角再至右下角,是一個遞增的一維陣列,故而考慮,對於每個右上角的頂點二分,若比要找的target更大,往左邊找,即y左移,若比要找的x更小,則往更大的地方尋找,即x下移。直到索引越界為止。
class Solution { public boolean searchMatrix(int[][] matrix, int target) { int m = matrix.length; int n = matrix[0].length; int i = 0, j = n - 1; while(i < m && n >= 0) { if(matrix[i][j] == target) { return true; }else if (matrix[i][j] > target) { j--; }else { i++; } } return false; } }
時間複雜度為\(O(m + n)\),空間複雜度為\(O(1)\)。