|
4 | 4 | class Solution {
|
5 | 5 | public:
|
6 | 6 | 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)); |
8 | 8 | dp[colors[0] - 1][0] = 0;
|
9 | 9 | for (int i = 1; i < colors.size(); ++i) {
|
10 | 10 | 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]; |
14 | 12 | }
|
15 |
| - dp[colors[i] - 1][i] = 0; |
| 13 | + dp[colors[i] - 1][i] = i; |
16 | 14 | }
|
17 | 15 |
|
18 |
| - dp[colors[colors.size() - 1] - 1][colors.size() - 1] = 0; |
| 16 | + dp[colors[colors.size() - 1] - 1][colors.size() - 1] = colors.size() - 1; |
19 | 17 | for (int i = colors.size() - 2; i >= 0; --i) {
|
20 | 18 | 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; |
25 | 21 | }
|
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]; |
61 | 25 | }
|
62 | 26 | }
|
63 |
| - right[colors[i] - 1][i] = 0; |
| 27 | + dp[colors[i] - 1][i] = i; |
64 | 28 | }
|
65 | 29 |
|
66 | 30 | vector<int> result;
|
67 | 31 | 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); |
70 | 34 | }
|
71 | 35 | return result;
|
72 | 36 | }
|
|
0 commit comments