[Leetcode] 750。角の長方形の数問題解決レポート



750 Number Corner Rectangles Problem Solving Report



トピック

各エントリが0または1しかないグリッドが与えられた場合、角の長方形の数を見つけます。



角の長方形は、軸に沿った長方形を形成するグリッド上の4つの異なる1です。値が1である必要があるのはコーナーのみであることに注意してください。また、使用される4つの1はすべて別個でなければなりません。

例1:



grid

例2:

[1, 200]

例3:

grid[i][j]

注意:



  1. 0の行と列の数それぞれ1の範囲になります。
  2. 1 6000のいずれかになりますまたはclass Solution { public: int countCornerRectangles(vector& grid) { int ans = 0 for (int r1 = 0 r1 + 1
  3. グリッド内の
    Input: grid = [[1, 0, 0, 1, 0], [0, 0, 1, 0, 1], [0, 0, 0, 1, 0], [1, 0, 1, 0, 1]] Output: 1 Explanation: There is only one corner rectangle, with corners grid[1][2], grid[1][4], grid[3][2], grid[3][4]. 
    の数は最大で
    Input: grid = [[1, 1, 1], [1, 1, 1], [1, 1, 1]] Output: 9 Explanation: There are four 2x2 rectangles, four 2x3 and 3x2 rectangles, and one 3x3 rectangle. 
    になります。

アイデア

最初は誤解され、DPを使用するのが正しい方法だと感じましたが、後で実際の列挙の時間計算量と空間計算量が少ないことがわかりました。任意の2行r1とr2を列挙して、これら2つの列にいくつの列が存在するかを確認します。行、この列の行r1と行r2の対応する要素が両方とも1であることを満たします。カウンター列が条件を満たすと仮定すると、これら2つの行によって形成できるリアングルの数はcounter *(counter-1)/です。 2.最後に、すべての長方形の数を返します。

グリッドにm行n列があると仮定すると、アルゴリズムの時間計算量はO(m ^ 2n)であり、空間計算量はO(1)です。もちろん、mがnよりもはるかに大きい場合は、時間計算量をO(mn ^ 2)に最適化することもできます。

コード

Input: grid = [[1, 1, 1, 1]] Output: 0 Explanation: Rectangles must have four distinct corners.