Leetcode-K以下の長方形の最大合計



Leetcode Max Sum Rectangle No Larger Than K



私のコード:

import java.util.TreeSet public class Solution { public int maxSumSubmatrix(int[][] matrix, int k) { if (matrix == null || matrix.length == 0 || matrix[0].length == 0) { return 0 } int max = Integer.MIN_VALUE int m = matrix.length int n = matrix[0].length for (int i = 0 i

参照:
https://discuss.leetcode.com/topic/48875/accepted-c-codes-with-explanation-and-references



自分で作ったのではなく、最初は諦めました。本当に難しいです。
この質問は、少なくとも2つの質問、最大3つの質問に分割できます。

1.行列を作成し、最大の長方形を見つけ、最大の合計と長方形の境界を返します。
https://www.youtube.com/watch?v=yCQN096CwWM
このA-threeビデオは本当に素晴らしいです。
時間計算量:O(col * col * row)
スペースの複雑さ:O(col)
アイデアは、DP、列、列と列の累積、および合計される列のDPです。彼を上から下にスキャンし、連続するサブ列のどれ、彼の合計、および最大値を見つけます。これは大きな長方形の下のサブ長方形であり、彼の合計が最大です。
現在の最大合計と比較されます。それが大きい場合、現在の最大合計が更新され、現在の最大行列の境界が更新されます。



2. 1次元配列を与え、連続セグメントのどれ、合計と最大値を見つけますが、k以下です
https://www.quora.com/Given-an-array-of-integers-A-and-an-integer-k-find-a-subarray-that-c​​ontains-the-largest-sum-subject-to-合計がk未満であるという制約

時間計算量:O(n log n)
スペース:O(n)

TreeSetに一致するものが必要です。
各要素の合計を累積するために使用される可変cumがあります。次に、ツリーセットに尋ねます。
.ceiling(cum --k)、そのような累積合計があるかどうか、cum-その後、値はk以下
存在する場合は、それを取り出して、サブ列の合計であるcumとの差を計算します。合計は、k以下です。
次に、この最大値を更新し続けます。



3.この質問は、列をスキャンすると、
時間計算量:O(col * col * row * log(row))
スペースの複雑さ:O(col)
colがrowよりもはるかに大きい場合、これは合理的ではありません。
これを解決するには2つの方法があります。
まず、行ごとに直接スキャンします。
次に、行列全体を時計回りに90度回転させてから、元のアルゴリズムを使用して計算します。

このトピックはほぼここにあります。とても興味深い。

ちなみに、KMPアルゴリズムはそれが何であるかを覚えていますか?

とにかく、頑張って、リチャード! -2016年9月21日