中级农民
- 积分
- 100
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2021-2-28
- 最后登录
- 1970-1-1
|
第3题,brute force需要 O((rows * cols)^2),以下解法O(rows * cols)
- //Time O(rows * cols)
- vector<int> max_k_submatrix(vector<vector<int>> &matrix, int k)
- {
- int rows = matrix.size(), cols = matrix[0].size();
- vector<vector<int>> k_row_sum(rows - k + 1, vector<int>(cols, 0));
- //滚动算k rows的和,0..k-1, 1..k, 2..k+1 ...., 将二维问题转化为一维问题
- for (int r = 0; r < k_row_sum.size(); r++) {
- for (int c = 0; c < cols; c++) {
- if (r < k)
- k_row_sum[0][c] += matrix[r][c];
- else
- k_row_sum[r - k + 1][c] = k_row_sum[r-k][c] + matrix[r][c] - matrix[r-k][c];
- }
- }
- vector<vector<int>> max_k_sum_index;
- int max_sum = INT_MIN;
- for (int r = 0; r < k_row_sum.size(); r++) {
- int sum = 0;
- int s = 0;
- for (int c = 0; c < cols; c++) {
- sum += k_row_sum[r][c];
- if (c - s + 1 > k)
- sum -= k_row_sum[r][s++];
- if (c - s + 1 == k && sum > max_sum) {
- max_sum = sum;
- max_k_sum_index.clear();
- max_k_sum_index.push_back({r, s});
- } else if (c - s + 1 == k && sum == max_sum) {
- max_k_sum_index.push_back({r, s});
- }
- }
- }
- unordered_set<int> distinct_nums;
- for (auto &index : max_k_sum_index) {
- int r1 = index[0], c1 = index[1];
- int r2 = index[0]+k-1, c2 = index[1]+k-1;
- for (int r = r1; r <= r2; r++) {
- for (int c = c1; c <= c2; c++) {
- distinct_nums.insert(matrix[r][c]);
- }
- }
- }
- vector<int> result;
- for (int num : distinct_nums)
- result.push_back(num);
- return result;
- }
复制代码 |
|