23 Sep 2023, 1:06 PM
23 Sep 2023, 1:06 PM

Find maximum sub-squares of size k x k

//TO-DO

vector<pair<int, int>> getMaxMatrix(vector<vector<int>>& matrix, int k) {
    int n = matrix.size();
    vector<vector<int>> helperMatrix(n - k + 1, vector<int>(n));
    unordered_map<vector<pair<int, int>> > map;
    // k must be smaller than or equal to n
    if (k > n)
        return {};

    for(int j = 0; j < n; j++) {
        for(int i = 0; i < k; i++)
            helperMatrix[0][j] += matrix[i][j];

        for(int i = 1; i < n - k + 1; i++)
            helperMatrix[i][j] = helperMatrix[i - 1][j] + matrix[i + k - 1][j] - matrix[i - 1][j];
    }
    int maxSoFar = 0;
    for(int i = 0; i < n - k + 1; i++) {
        int maxHere = 0;
        for(int j = 0; j < k; j++)
            maxHere += helperMatrix[i][j];

        if(maxHere > maxSoFar) {
            maxSoFar = maxHere;
            map[maxSoFar].push_back({i, 0});
        }    

        for(int j = 1; j < n - k + 1; j++) {
            maxHere += helperMatrix[i][j + k - 1] - helperMatrix[i][j - 1];
            if(maxHere > maxSoFar) {
                maxSoFar = maxHere;
                map[maxSoFar].push_back({i, j});
            }
        }
    }
    
    return map[maxSoFar];
}

int main() {
     vector<vector<int>> matrix = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    //printSum_v1(matrix, 2);
    vector<pair<int, int>> res = getMaxMatrix(matrix, 2);

    for(auto p : res) {
        cout << "{ " + p.first + ", " + p.second + " }";
    }
}