[매트릭스 2차원 또는 3차원 dp] 최대 하위 매트릭스, 하위 매트릭스 빠른 구화(최대 직사각형 사용)
Maximal Rectangle
Total Accepted: 9039
Total Submissions: 41503 My Submissions
Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.
세 가지 추이 방법:
1 maxR[i][j]=max{ minHCnt(k...j)*(j+1-k) }, k=0...j 가지치기 주의.hCnt[k-x]>hCnt[k]일 때 hCnt[k]를 삭제할 수 있습니다.선형 스캐닝 방법으로 가지치기 (112ms)
2 maxR[i][k][j]=maxR[i-1][k][j]+(j+1-k), 그 중에서arr[i][k~j]는 모두'1'이어야 한다.그렇지 않으면 maxR[i][k][j]=0.(72ms)
3 maxR[i][j] = maxHistogram {maxHCntOne[k...i][j]}, 그 중에서 maxHCntOne과 maxHistogram은 O(n)이고 전체 알고리즘은 O(n^n)이다.
방법1:
list가 loop을 반대로 하고 삭제한 쓰기 방법을 주의하십시오!
class Solution {
public:
#define MAXN 200000
// +3 dp
int maximalRectangle(vector > &matrix) {
int n=matrix.size();if(n==0) return 0;
int m=matrix[0].size();if(m==0) return 0;
vector > hCnt(n,vector(m,0));
for(int j=0;j0?hCnt[i-1][j]+1:1;
else hCnt[i][j]=0;
}
}
//find the largest rect from hCnt[i][j]
int mR=0;
typedef pair Pr;
for(int i=0;i tmp;
for(int j=0;jhCnt[i][j+1]||j==0||hCnt[i][j]>hCnt[i][j-1]) //h[i][j] is not a extremal small value @@@error:j==0 fault as i==0
tmp.insert(tmp.begin(),Pr(j,hCnt[i][j]));
if(tmp.empty()) continue;///@@@error: must consider list empty, then the for loop will not work
for(list::iterator k=(--tmp.end());;k--){
int t=min(hCnt[i][j],k->second);
if(t>mH){
k->second= mH=t;
mR=max(mR,mH*(j-k->first+1));
}
else {//erase
tmp.erase(k++);//@@warning:after erase, k point to next node (or end())
}
//after handling the last element(tmp.begin()),break
if(k==tmp.begin()) break;
}
}
}
return mR;
}
};
방법2:
class Solution {
public:
int maximalRectangle(vector > &matrix) {
int L=matrix.size();
if(L<=0) return 0;
int R=matrix[0].size();
int R2=R*R;
int *height=new int [R*R*2];
memset(height,0,sizeof(int)*2*R*R);
int max=0;
for(int i=0;i
방법3:class Solution {
public:
int maximalRectangle(vector > &matrix) {
int n = matrix.size();
if(!n) return 0;
int m = matrix[0].size();
if(!m) return 0;
vector > lines(n, vector(m, 0));
int maxArea = 0;
for(int i = 0; i0? lines[i-1][j]:0; //@error: j>0? lines[i][j-1]
if(matrix[i][j]=='1') lines[i][j] = t+1;
else lines[i][j] = 0;
}
// max rectangle in lines[i][0, m-1]
stack > ss;
int tmp = 0;
for(int j = 0; j<=m; j++){
int t = j==m? -1 : lines[i][j], s = 0;
while(!ss.empty() && ss.top().first>= t){
s+= ss.top().second;
tmp = max(tmp, ss.top().first*s);
ss.pop();
}
ss.push(pair(t, s+1));
tmp = max(tmp, t*(s+1));
}
maxArea = max(maxArea, tmp);
}
return maxArea;
}
};
하위 행렬 구화
하나의 매트릭스 A[m][n] 하위 매트릭스와 빠른 구법 (업데이트 A[x][y] 및 조회 포함
Sum(i1, j1, i2, j2)):
1B[I][J]는 서브매트릭스: A[0][0]에서 A[I][J]까지의 합을 나타낸다.Sum(i1,j1,i2,j2)=B[i2][j2]-B[i2][j1]-B[i1][j2]+B[i1][j1],
조회 복잡도 O(1),
업데이트 복잡도: A[x][y]가 변할 때 B[x, m-1][y, n-1]는 모두 업데이트가 필요합니다. 복잡도 O(n^2)
2B[I][J]는 행 B[I][0]에서 B[I][J]까지의 합을 나타낸다. 그러면
Sum(i1,j1,i2,j2)=E(B[i1,i2][j2]-B[i1,i2][j1])
질의 복잡성 O(n)
업데이트 복잡성 O(n)
3 상기 변형, B[I]는 하나의 라인 트리로 변하여 이 줄의 구간과 유지한다.
그러면 Sum(B[I][j1<=j<=j2)은 B[I] 이 라인 나무의 구간 구화(O(lgn))로 변하여 T[I]로 기록할 수 있다.
그러면
Sum(i1, j1, i2, j2) = E(T[i1, i2])(O(n*lgn) )
조회 복잡도 O (nlgn)
업데이트 복잡성 O(1)
4 상기 변형,
B[I]는 하나의 라인 트리가 되어 C[I][j](=sum(A[0, I][j])의 구간과
영T[I]=B[I][j1, j2](O(lgn)),
Sum(i1,j1,i2,j2)=T[i2]-T[i1](O(lgn))
조회 복잡도 O (lgn)
업데이트 복잡도: A[x][y]가 변할 때 C[x, m-1][y]를 업데이트해야 하고 복잡도 O(n)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
0부터 시작하는 LeetCode Day8 「1302. Deepest Leaves Sum」해외에서는 엔지니어의 면접에 있어서 코딩 테스트라고 하는 것이 행해지는 것 같고, 많은 경우, 특정의 함수나 클래스를 주제에 따라 실장한다고 하는 것이 메인이다. 빠른 이야기가 본고장에서도 행해지고 있는 것 같은 코...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.