-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Expand file tree
/
Copy pathminimum-absolute-difference-in-sliding-submatrix.cpp
More file actions
81 lines (79 loc) · 2.85 KB
/
minimum-absolute-difference-in-sliding-submatrix.cpp
File metadata and controls
81 lines (79 loc) · 2.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// Time: O(m * n * k^2)
// Space: O(k^2)
// two pointers, sliding window, bst
class Solution {
public:
vector<vector<int>> minAbsDiff(vector<vector<int>>& grid, int k) {
vector<vector<int>> result(size(grid) - k + 1, vector<int>(size(grid[0]) - k + 1, -1));
multiset<int> bst;
for (int di = 0; di < k; ++di) {
for (int dj = 0; dj < k; ++dj) {
bst.emplace(grid[0 + di][0 + dj]);
}
}
for (int i = 0; i + (k - 1) < size(grid); ++i) {
multiset<int> bst2(bst);
for (int j = 0; j + (k - 1) < size(grid[0]); ++j) {
int mn = numeric_limits<int>::max();
int prev = numeric_limits<int>::min();
for (const auto& x : bst2) {
if (prev != numeric_limits<int>::min() && x != prev) {
mn = min(mn, x - prev);
}
prev = x;
}
result[i][j] = mn != numeric_limits<int>::max() ? mn : 0;
if (j + 1 == size(grid[0]) - (k - 1)) {
continue;
}
for (int di = 0; di < k; ++di) {
bst2.erase(bst2.find(grid[i + di][j]));
bst2.emplace(grid[i + di][j + k]);
}
}
if (i + 1 == size(grid) - (k-1)) {
continue;
}
for (int dj = 0; dj < k; ++dj) {
bst.erase(bst.find(grid[i][0 + dj]));
bst.emplace(grid[i + k][0 + dj]);
}
}
return result;
}
};
// Time: O(m * n * k^2 * logk)
// Space: O(k^2)
// brute force, sort
class Solution2 {
public:
vector<vector<int>> minAbsDiff(vector<vector<int>>& grid, int k) {
vector<vector<int>> result(size(grid) - k + 1, vector<int>(size(grid[0]) - k + 1, -1));
for (int i = 0; i + (k - 1) < size(grid); ++i) {
for (int j = 0; j + (k - 1) < size(grid[0]); ++j) {
vector<int> vals;
for (int di = 0; di < k; ++di) {
for (int dj = 0; dj < k; ++dj) {
vals.emplace_back(grid[i + di][j + dj]);
}
}
sort(begin(vals), end(vals));
vals.erase(unique(begin(vals), end(vals)), end(vals));
if (size(vals) == 1) {
result[i][j] = 0;
continue;
}
int mn = numeric_limits<int>::max();
int prev = numeric_limits<int>::min();
for (const auto& x : vals) {
if (prev != numeric_limits<int>::min()) {
mn = min(mn, x - prev);
}
prev = x;
}
result[i][j] = mn;
}
}
return result;
}
};