Skip to content

Commit 26f1d04

Browse files
authored
Update shortest-distance-to-target-color.cpp
1 parent ce6835c commit 26f1d04

File tree

1 file changed

+12
-48
lines changed

1 file changed

+12
-48
lines changed

C++/shortest-distance-to-target-color.cpp

Lines changed: 12 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -4,69 +4,33 @@
44
class Solution {
55
public:
66
vector<int> shortestDistanceColor(vector<int>& colors, vector<vector<int>>& queries) {
7-
vector<vector<int>> dp(3, vector<int>(colors.size(), numeric_limits<int>::max()));
7+
vector<vector<int>> dp(3, vector<int>(colors.size(), -1));
88
dp[colors[0] - 1][0] = 0;
99
for (int i = 1; i < colors.size(); ++i) {
1010
for (int color = 0; color < 3; ++color) {
11-
if (dp[color][i - 1] != numeric_limits<int>::max()) {
12-
dp[color][i] = dp[color][i - 1] + 1;
13-
}
11+
dp[color][i] = dp[color][i - 1];
1412
}
15-
dp[colors[i] - 1][i] = 0;
13+
dp[colors[i] - 1][i] = i;
1614
}
1715

18-
dp[colors[colors.size() - 1] - 1][colors.size() - 1] = 0;
16+
dp[colors[colors.size() - 1] - 1][colors.size() - 1] = colors.size() - 1;
1917
for (int i = colors.size() - 2; i >= 0; --i) {
2018
for (int color = 0; color < 3; ++color) {
21-
if (dp[color][i + 1] != numeric_limits<int>::max()) {
22-
if (abs(dp[color][i + 1] - 1) < dp[color][i]) {
23-
dp[color][i] = dp[color][i + 1] - 1;
24-
}
19+
if (dp[color][i + 1] != -1) {
20+
continue;
2521
}
26-
}
27-
dp[colors[i] - 1][i] = 0;
28-
}
29-
30-
vector<int> result;
31-
for (const auto& query : queries) {
32-
const auto d = abs(dp[query[1] - 1][query[0]]);
33-
result.emplace_back(d != numeric_limits<int>::max() ? d : -1);
34-
}
35-
return result;
36-
}
37-
};
38-
39-
// Time: O(n)
40-
// Space: O(n)
41-
class Solution2 {
42-
public:
43-
vector<int> shortestDistanceColor(vector<int>& colors, vector<vector<int>>& queries) {
44-
vector<vector<int>> left(3, vector<int>(colors.size(), numeric_limits<int>::max()));
45-
left[colors[0] - 1][0] = 0;
46-
for (int i = 1; i < colors.size(); ++i) {
47-
for (int color = 0; color < 3; ++color) {
48-
if (left[color][i - 1] != numeric_limits<int>::max()) {
49-
left[color][i] = left[color][i - 1] + 1;
50-
}
51-
}
52-
left[colors[i] - 1][i] = 0;
53-
}
54-
55-
vector<vector<int>> right(3, vector<int>(colors.size(), numeric_limits<int>::max()));
56-
right[colors[colors.size() - 1] - 1][colors.size() - 1] = 0;
57-
for (int i = colors.size() - 2; i >= 0; --i) {
58-
for (int color = 0; color < 3; ++color) {
59-
if (right[color][i + 1] != numeric_limits<int>::max()) {
60-
right[color][i] = right[color][i + 1] + 1;
22+
if (dp[color][i] == -1 ||
23+
abs(dp[color][i + 1] - i) < abs(dp[color][i] - i)) {
24+
dp[color][i] = dp[color][i + 1];
6125
}
6226
}
63-
right[colors[i] - 1][i] = 0;
27+
dp[colors[i] - 1][i] = i;
6428
}
6529

6630
vector<int> result;
6731
for (const auto& query : queries) {
68-
const auto d = min(left[query[1] - 1][query[0]], right[query[1] - 1][query[0]]);
69-
result.emplace_back(d != numeric_limits<int>::max() ? d : -1);
32+
const auto d = abs(dp[query[1] - 1][query[0]]);
33+
result.emplace_back(dp[query[1] - 1][query[0]] != -1 ? abs(dp[query[1] - 1][query[0]] - query[0]) : -1);
7034
}
7135
return result;
7236
}

0 commit comments

Comments
 (0)