1. 程式人生 > 程式設計 >使用.NET 6開發TodoList應用之引入資料儲存的思路詳解

使用.NET 6開發TodoList應用之引入資料儲存的思路詳解

劍指 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)\)