C/C++ | LeetCode
Kanalga Telegramβda oβtish
Π‘Π°ΠΉΡ: https://easyoffer.ru/ ΠΡΠ΅ ΠΊΠ°Π½Π°Π»Ρ: t.me/+xGeAw6ckJ4liYzQy ΠΠΎΠ½ΡΠ°ΠΊΡ Π΄Π»Ρ ΡΠ΅ΠΊΠ»Π°ΠΌΡ: @easyoffer_adv
Ko'proq ko'rsatish3 238
Obunachilar
+424 soatlar
+127 kunlar
+230 kunlar
Postlar arxiv
3 238
ΠΠ°Π΄Π°ΡΠ°: 1802. Maximum Value at a Given Index in a Bounded Array
Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡ: medium
ΠΠ°Π½Ρ ΡΡΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΡΡ
ΡΠ΅Π»ΡΡ
ΡΠΈΡΠ»Π°:
n, index ΠΈ maxSum. ΠΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΡΡΡΠΎΠΈΡΡ ΠΌΠ°ΡΡΠΈΠ² nums (ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΡΠΈΡ Ρ Π½ΡΠ»Ρ), ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΠ΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΡΡΠ»ΠΎΠ²ΠΈΡΠΌ:
- nums.length == n
- nums[i] ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΡΠΌ ΡΠ΅Π»ΡΠΌ ΡΠΈΡΠ»ΠΎΠΌ, Π³Π΄Π΅ 0 <= i < n.
- abs(nums[i] - nums[i+1]) <= 1, Π³Π΄Π΅ 0 <= i < n-1.
- Π‘ΡΠΌΠΌΠ° Π²ΡΠ΅Ρ
ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΌΠ°ΡΡΠΈΠ²Π° nums Π½Π΅ ΠΏΡΠ΅Π²ΡΡΠ°Π΅Ρ maxSum.
- nums[index] ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½.
ΠΠ΅ΡΠ½ΠΈΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ nums[index] Π² ΠΏΠΎΡΡΡΠΎΠ΅Π½Π½ΠΎΠΌ ΠΌΠ°ΡΡΠΈΠ²Π΅.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ abs(x) ΡΠ°Π²Π½ΠΎ x, Π΅ΡΠ»ΠΈ x >= 0, ΠΈ -x Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅.
ΠΡΠΈΠΌΠ΅Ρ:
Input: n = 4, index = 2, maxSum = 6 Output: 2π¨βπ» ΠΠ»Π³ΠΎΡΠΈΡΠΌ: 1β£ΠΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ getSum(index, value) Π΄Π»Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΡΡΠΌΠΌΡ ΠΌΠ°ΡΡΠΈΠ²Π° ΠΏΡΠΈ ΡΡΠ»ΠΎΠ²ΠΈΠΈ, ΡΡΠΎ nums[index] = value. 2β£ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠΉΡΠ΅ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΏΠΎΠΈΡΠΊΠ° [left, right] Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ left = 1 ΠΈ right = maxSum. ΠΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ Π±ΠΈΠ½Π°ΡΠ½ΡΠΉ ΠΏΠΎΠΈΡΠΊ: Π²ΡΡΠΈΡΠ»ΠΈΡΠ΅ mid = (left + right + 1) / 2 ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅, Π΅ΡΠ»ΠΈ getSum(index, mid) <= maxSum. ΠΡΠ»ΠΈ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ, ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ left = mid, ΠΈΠ½Π°ΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ right = mid - 1. 3β£ΠΠ΅ΡΠ½ΠΈΡΠ΅ left ΠΏΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ Π±ΠΈΠ½Π°ΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠΈΡΠΊΠ°. π Π Π΅ΡΠ΅Π½ΠΈΠ΅:
class Solution {
private:
long getSum(int index, int value, int n) {
long count = 0;
if (value > index) {
count += (long)(value + value - index) * (index + 1) / 2;
} else {
count += (long)(value + 1) * value / 2 + index - value + 1;
}
if (value >= n - index) {
count += (long)(value + value - n + 1 + index) * (n - index) / 2;
} else {
count += (long)(value + 1) * value / 2 + n - index - value;
}
return count - value;
}
public:
int maxValue(int n, int index, int maxSum) {
int left = 1, right = maxSum;
while (left < right) {
int mid = (left + right + 1) / 2;
if (getSum(index, mid, n) <= maxSum) {
left = mid;
} else {
right = mid - 1;
}
}
return left;
}
};
Π‘ΡΠ°Π²Ρ π ΠΈ Π·Π°Π±ΠΈΡΠ°ΠΉ π ΠΠ°Π·Ρ Π·Π½Π°Π½ΠΈΠΉ3 238
ΠΠ°Π΄Π°ΡΠ°: 892. Surface Area of 3D Shapes
Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡ: easy
ΠΠ°ΠΌ Π΄Π°Π½Π° ΡΠ΅ΡΠΊΠ° n x n, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΉ Π²Ρ ΡΠ°Π·ΠΌΠ΅ΡΡΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΡΠ±ΠΈΠΊΠΎΠ² 1 x 1 x 1. ΠΠ°ΠΆΠ΄ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ v = grid[i][j] ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ Π±Π°ΡΠ½Ρ ΠΈΠ· v ΠΊΡΠ±ΠΈΠΊΠΎΠ², ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½Π½ΡΡ
Π½Π° Π²Π΅ΡΡΠΈΠ½Π΅ ΡΡΠ΅ΠΉΠΊΠΈ (i, j). ΠΠΎΡΠ»Π΅ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΊΡΠ±ΠΈΠΊΠΎΠ² Π²Ρ ΡΠ΅ΡΠΈΠ»ΠΈ ΡΠΊΠ»Π΅ΠΈΡΡ Π²ΡΠ΅ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΏΡΠΈΠ»Π΅Π³Π°ΡΡΠΈΠ΅ ΠΊΡΠ±ΠΈΠΊΠΈ Π΄ΡΡΠ³ Ρ Π΄ΡΡΠ³ΠΎΠΌ, ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΡ
3D-ΡΠΈΠ³ΡΡ. ΠΠ΅ΡΠ½ΠΈΡΠ΅ ΠΎΠ±ΡΡΡ ΠΏΠ»ΠΎΡΠ°Π΄Ρ ΠΏΠΎΠ²Π΅ΡΡ
Π½ΠΎΡΡΠΈ ΠΏΠΎΠ»ΡΡΠΈΠ²ΡΠΈΡ
ΡΡ ΡΠΈΠ³ΡΡ. ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅: Π½ΠΈΠΆΠ½ΡΡ Π³ΡΠ°Π½Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΠΈΠ³ΡΡΡ ΡΡΠΈΡΡΠ²Π°Π΅ΡΡΡ Π² ΠΏΠ»ΠΎΡΠ°Π΄ΠΈ Π΅Π΅ ΠΏΠΎΠ²Π΅ΡΡ
Π½ΠΎΡΡΠΈ.
ΠΡΠΈΠΌΠ΅Ρ:
Input: grid = [[1,2],[3,4]] Output: 34π¨βπ» ΠΠ»Π³ΠΎΡΠΈΡΠΌ: 1β£ΠΡΠΎΠΉΡΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΉ ΡΠ΅ΡΠΊΠ΅ ΠΈ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π±Π°ΡΠ½ΠΈ (ΡΡΠ΅ΠΉΠΊΠΈ) ΠΏΠΎΡΡΠΈΡΠ°ΡΡ Π½Π°ΡΠ°Π»ΡΠ½ΡΡ ΠΏΠ»ΠΎΡΠ°Π΄Ρ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ: Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΠ»ΠΎΡΠ°Π΄Ρ Π²Π΅ΡΡ Π½Π΅ΠΉ ΠΈ Π½ΠΈΠΆΠ½Π΅ΠΉ Π³ΡΠ°Π½Π΅ΠΉ, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ΅ΡΡΡΠ΅ Π±ΠΎΠΊΠΎΠ²ΡΠ΅ Π³ΡΠ°Π½ΠΈ. 2β£ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π±Π°ΡΠ½ΠΈ ΡΠΌΠ΅Π½ΡΡΠΈΡΡ ΠΏΠ»ΠΎΡΠ°Π΄Ρ Π±ΠΎΠΊΠΎΠ²ΡΡ Π³ΡΠ°Π½Π΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΈΠ»Π΅Π³Π°ΡΡ ΠΊ ΡΠΎΡΠ΅Π΄Π½ΠΈΠΌ Π±Π°ΡΠ½ΡΠΌ, Ρ ΡΡΠ΅ΡΠΎΠΌ Π²ΡΡΠΎΡΡ ΡΠΎΡΠ΅Π΄Π½ΠΈΡ Π±Π°ΡΠ΅Π½. 3β£ΠΡΠΎΡΡΠΌΠΌΠΈΡΠΎΠ²Π°ΡΡ Π²ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠ»ΠΎΡΠ°Π΄Π΅ΠΉ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈΡΠΎΠ³ΠΎΠ²ΠΎΠΉ ΠΏΠ»ΠΎΡΠ°Π΄ΠΈ ΠΏΠΎΠ²Π΅ΡΡ Π½ΠΎΡΡΠΈ. π Π Π΅ΡΠ΅Π½ΠΈΠ΅:
int surfaceArea(vector<vector<int>>& grid) {
int n = grid.size();
int area = 0;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (grid[i][j] > 0) {
area += (grid[i][j] * 4) + 2;
}
if (i > 0) {
area -= min(grid[i][j], grid[i-1][j]) * 2;
}
if (j > 0) {
area -= min(grid[i][j], grid[i][j-1]) * 2;
}
}
}
return area;
}
Π‘ΡΠ°Π²Ρ π ΠΈ Π·Π°Π±ΠΈΡΠ°ΠΉ π ΠΠ°Π·Ρ Π·Π½Π°Π½ΠΈΠΉ3 238
ΠΠ°Π΄Π°ΡΠ°: 931. Minimum Falling Path Sum
Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡ: medium
ΠΡΠ»ΠΈ Π·Π°Π΄Π°Π½ ΠΌΠ°ΡΡΠΈΠ² ΡΠ΅Π»ΡΡ
ΡΠΈΡΠ΅Π» n x n, Π²Π΅ΡΠ½ΠΈΡΠ΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΡ ΡΡΠΌΠΌΡ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΏΠ°Π΄Π°ΡΡΠ΅Π³ΠΎ ΠΏΡΡΠΈ ΡΠ΅ΡΠ΅Π· ΠΌΠ°ΡΡΠΈΡΡ. ΠΠ°Π΄Π°ΡΡΠΈΠΉ ΠΏΡΡΡ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Ρ Π»ΡΠ±ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π² ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅ ΠΈ Π²ΡΠ±ΠΈΡΠ°Π΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΡΡΠΎΠΊΠ΅, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π»ΠΈΠ±ΠΎ ΠΏΡΡΠΌΠΎ ΠΏΠΎΠ΄ Π½ΠΈΠΌ, Π»ΠΈΠ±ΠΎ ΠΏΠΎ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ ΡΠ»Π΅Π²Π°/ΡΠΏΡΠ°Π²Π°. Π ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠΌ ΠΈΠ· ΠΏΠΎΠ·ΠΈΡΠΈΠΈ (row, col) Π±ΡΠ΄Π΅Ρ (row + 1, col - 1), (row + 1, col) ΠΈΠ»ΠΈ (row + 1, col + 1).
ΠΡΠΈΠΌΠ΅Ρ:
Input: matrix = [[2,1,3],[6,5,4],[7,8,9]] Output: 13π¨βπ» ΠΠ»Π³ΠΎΡΠΈΡΠΌ: 1β£ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΡ ΡΡΠΌΠΌ ΠΏΠ°Π΄Π°ΡΡΠΈΡ ΠΏΡΡΠ΅ΠΉ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ. 2β£ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ dp ΠΌΠ°ΡΡΠΈΠ² ΠΊΠΎΠΏΠΈΠ΅ΠΉ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΌΠ°ΡΡΠΈΡΡ. ΠΡΠΎΠΉΡΠΈ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅, ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ dp ΠΌΠ°ΡΡΠΈΠ² Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΈΠ· ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ ΡΡΡΠΎΠΊΠΈ. 3β£ΠΠ΅ΡΠ½ΡΡΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ ΡΡΡΠΎΠΊΠ΅ dp ΠΌΠ°ΡΡΠΈΠ²Π°. π Π Π΅ΡΠ΅Π½ΠΈΠ΅:
class Solution {
public:
int minFallingPathSum(vector<vector<int>>& matrix) {
int n = matrix.size();
vector<int> dp(matrix[0]);
for (int i = 1; i < n; ++i) {
vector<int> newDp(n, 0);
for (int j = 0; j < n; ++j) {
newDp[j] = matrix[i][j] + min({dp[j], j > 0 ? dp[j - 1] : INT_MAX, j < n - 1 ? dp[j + 1] : INT_MAX});
}
dp = newDp;
}
return *min_element(dp.begin(), dp.end());
}
};
Π‘ΡΠ°Π²Ρ π ΠΈ Π·Π°Π±ΠΈΡΠ°ΠΉ π ΠΠ°Π·Ρ Π·Π½Π°Π½ΠΈΠΉ3 238
ΠΠ°Π΄Π°ΡΠ°: 210. Course Schedule II
Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡ: medium
ΠΠ°Π½ΠΎ ΡΠΈΡΠ»ΠΎ numCourses ΠΈ ΡΠΏΠΈΡΠΎΠΊ ΠΏΠ°Ρ prerequisites, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄Π°Ρ ΠΏΠ°ΡΠ° [a, b] ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ: ΡΡΠΎΠ±Ρ Π²Π·ΡΡΡ ΠΊΡΡΡ a, Π½ΡΠΆΠ½ΠΎ ΡΠ½Π°ΡΠ°Π»Π° ΠΏΡΠΎΠΉΡΠΈ ΠΊΡΡΡ b.
ΠΠ΅ΡΠ½ΠΈΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ
ΠΏΠΎΡΡΠ΄ΠΊΠΎΠ² ΠΏΡΠΎΡ
ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΠΊΡΡΡΠΎΠ².
ΠΡΠ»ΠΈ ΠΏΡΠΎΠΉΡΠΈ Π²ΡΠ΅ ΠΊΡΡΡΡ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ (ΠΈΠ·-Π·Π° ΡΠΈΠΊΠ»ΠΎΠ²) β Π²Π΅ΡΠ½ΠΈΡΠ΅ ΠΏΡΡΡΠΎΠΉ ΠΌΠ°ΡΡΠΈΠ².
ΠΡΠΈΠΌΠ΅Ρ:
Input: numCourses = 4, prerequisites = [[1,0],[2,0],[3,1],[3,2]] Output: [0,2,1,3]π¨βπ» ΠΠ»Π³ΠΎΡΠΈΡΠΌ: 1β£ΠΠΎΡΡΡΠΎΠ΅Π½ΠΈΠ΅ Π³ΡΠ°ΡΠ° ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° ΠΊ DFS Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠΏΠΈΡΠΎΠΊ ΡΠΌΠ΅ΠΆΠ½ΠΎΡΡΠΈ adjList, Π³Π΄Π΅ adjList[b] ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π²ΡΠ΅ ΠΊΡΡΡΡ, Π·Π°Π²ΠΈΡΡΡΠΈΠ΅ ΠΎΡ b. ΠΠ°ΠΆΠ΄ΡΠΉ ΠΊΡΡΡ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΠΌ ΡΠ²Π΅ΡΠΎΠΌ: WHITE = 1 β Π½Π΅ ΠΏΠΎΡΠ΅ΡΡΠ½ GRAY = 2 β Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ BLACK = 3 β ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½ 2β£ΠΠ±Ρ ΠΎΠ΄ Π² Π³Π»ΡΠ±ΠΈΠ½Ρ (DFS) ΠΈ Π΄Π΅ΡΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΠΊΠ»Π° ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½Π΅ΠΏΠΎΡΠ΅ΡΡΠ½Π½ΠΎΠ³ΠΎ ΡΠ·Π»Π° Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ dfs. ΠΡΠ»ΠΈ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΎΠ±Ρ ΠΎΠ΄Π° ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ²Π°Π΅ΠΌ ΡΠΈΠΊΠ» (Π²ΠΎΠ·Π²ΡΠ°Ρ ΠΊ GRAY ΡΠ·Π»Ρ), Π·Π½Π°ΡΠΈΡ, ΠΏΡΠΎΠΉΡΠΈ ΠΊΡΡΡΡ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. 3β£Π€ΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡΠ²Π΅ΡΠ° ΠΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ DFS ΠΏΠΎ Π²ΡΠ΅ΠΌ ΡΠ·Π»Π°ΠΌ ΡΠΎΡΠΌΠΈΡΡΠ΅ΠΌ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΠΊΡΡΡΠΎΠ² ΠΈΠ· ΡΡΠ΅ΠΊΠ° (ΠΈΠ»ΠΈ ΠΌΠ°ΡΡΠΈΠ²Π°) topologicalOrder, ΠΈΠ½Π²Π΅ΡΡΠΈΡΡΡ Π΅Π³ΠΎ. πΠ Π΅ΡΠ΅Π½ΠΈΠ΅:
cppΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡΠ Π΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°ΡΡclass Solution {
public:
int WHITE = 1;
int GRAY = 2;
int BLACK = 3;
vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
bool isPossible = true;
map<int, int> color;
map<int, vector<int>> adjList;
vector<int> topologicalOrder;
for (int i = 0; i < numCourses; i++) color[i] = WHITE;
for (vector<int> relation : prerequisites) {
int dest = relation[0];
int src = relation[1];
adjList[src].push_back(dest);
}
for (int i = 0; i < numCourses && isPossible; i++) {
if (color[i] == WHITE) {
dfs(i, color, adjList, isPossible, topologicalOrder);
}
}
vector<int> order;
if (isPossible) {
order.resize(numCourses);
for (int i = 0; i < numCourses; i++) {
order[i] = topologicalOrder[numCourses - i - 1];
}
}
return order;
}
void dfs(int node, map<int, int>& color, map<int, vector<int>>& adjList,
bool& isPossible, vector<int>& topologicalOrder) {
if (!isPossible) return;
color[node] = GRAY;
for (int neighbor : adjList[node]) {
if (color[neighbor] == WHITE) {
dfs(neighbor, color, adjList, isPossible, topologicalOrder);
} else if (color[neighbor] == GRAY) {
isPossible = false;
}
}
color[node] = BLACK;
topologicalOrder.push_back(node);
}
};
Π‘ΡΠ°Π²Ρ π ΠΈ Π·Π°Π±ΠΈΡΠ°ΠΉ π ΠΠ°Π·Ρ Π·Π½Π°Π½ΠΈΠΉ3 238
β‘οΈ Π ΡΠ΅ΡΠΈ Π½Π°ΡΠ°Π»ΠΈ ΠΌΠ°ΡΡΠΎΠ²ΠΎ ΡΠ»ΠΈΠ²Π°ΡΡ ΠΊΡΡΡΡ ΠΈ ΠΊΠ½ΠΈΠ³ΠΈ ΠΈΠ·Π²Π΅ΡΡΠ½ΡΡ
ΠΎΠ½Π»Π°ΠΉΠ½ ΡΠΊΠΎΠ» ΠΏΠΎ Π°ΠΉΡΠΈ
ΠΠΎΡ ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ Π±Π°Π·Π° Ρ ΡΠΎΠ½Π½ΠΎΠΉ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π° (ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎ ΠΏΠΎΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ):
(363 Π²ΠΈΠ΄Π΅ΠΎ, 87 ΠΊΠ½ΠΈΠ³ΠΈ) β Python
(415 Π²ΠΈΠ΄Π΅ΠΎ, 68 ΠΊΠ½ΠΈΠ³ΠΈ) β Frontend
(143 Π²ΠΈΠ΄Π΅ΠΎ, 33 ΠΊΠ½ΠΈΠ³ΠΈ) β ΠΠ/Π₯Π°ΠΊΠΈΠ½Π³
(352 Π²ΠΈΠ΄Π΅ΠΎ, 89 ΠΊΠ½ΠΈΠ³ΠΈ) β Π‘/Π‘++/C#
(343 Π²ΠΈΠ΄Π΅ΠΎ, 87 ΠΊΠ½ΠΈΠ³ΠΈ) β Java/QA
(176 Π²ΠΈΠ΄Π΅ΠΎ, 32 ΠΊΠ½ΠΈΠ³ΠΈ) β Git/Linux
(174 Π²ΠΈΠ΄Π΅ΠΎ, 91 ΠΊΠ½ΠΈΠ³ΠΈ) β DevOps
(167 Π²ΠΈΠ΄Π΅ΠΎ, 53 ΠΊΠ½ΠΈΠ³ΠΈ) β PHP/1Π‘
(227 Π²ΠΈΠ΄Π΅ΠΎ, 83 ΠΊΠ½ΠΈΠ³ΠΈ) β SQL/ΠΠ
(114 Π²ΠΈΠ΄Π΅ΠΎ, 77 ΠΊΠ½ΠΈΠ³ΠΈ) β Π‘ΠΈΡΠ°Π΄ΠΌΠΈΠ½
(107 Π²ΠΈΠ΄Π΅ΠΎ, 43 ΠΊΠ½ΠΈΠ³ΠΈ) β BA/SA
(181 Π²ΠΈΠ΄Π΅ΠΎ, 32 ΠΊΠ½ΠΈΠ³ΠΈ) β Go/Rust
(167 Π²ΠΈΠ΄Π΅ΠΎ, 43 ΠΊΠ½ΠΈΠ³ΠΈ) β Kotlin/Swift
(112 Π²ΠΈΠ΄Π΅ΠΎ, 24 ΠΊΠ½ΠΈΠ³ΠΈ) β Flutter
(137 Π²ΠΈΠ΄Π΅ΠΎ, 93 ΠΊΠ½ΠΈΠ³ΠΈ) β DS/ML
(113 Π²ΠΈΠ΄Π΅ΠΎ, 82 ΠΊΠ½ΠΈΠ³ΠΈ) β GameDev
(183 Π²ΠΈΠ΄Π΅ΠΎ, 37 ΠΊΠ½ΠΈΠ³ΠΈ) β ΠΠΈΠ·Π°ΠΉΠ½
(136 Π²ΠΈΠ΄Π΅ΠΎ, 33 ΠΊΠ½ΠΈΠ³ΠΈ) β PM/HR
Π‘ΠΊΠ°ΡΠΈΠ²Π°ΡΡ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π½ΡΠΆΠ½ΠΎ β Π²ΡΠ΅ Π²ΡΠ»ΠΎΠΆΠΈΠ»ΠΈ Π² Telegram
3 238
ΠΠ°Π΄Π°ΡΠ°: 678. Valid Parenthesis String
Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡ: medium
Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΠΊΠ°ΡΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ:
ΠΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΡΡΡΠΎΠΊΠΎΠ²ΡΠΉ ΠΊΠ»ΡΡ Π½Π° Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅.
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡΠΌΠΌΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ, Ρ ΠΊΠΎΡΠΎΡΡΡ
ΠΊΠ»ΡΡ ΠΈΠΌΠ΅Π΅Ρ ΠΏΡΠ΅ΡΠΈΠΊΡ, ΡΠ°Π²Π½ΡΠΉ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅.
Π Π΅Π°Π»ΠΈΠ·ΡΠΉΡΠ΅ ΠΊΠ»Π°ΡΡ MapSum:
ΠΠ°Π½Π° ΡΡΡΠΎΠΊΠ° s, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ°Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΈ ΡΠΈΠΏΠ° ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ²: '(', ')' ΠΈ '*'. ΠΠ΅ΡΠ½ΡΡΡ true, Π΅ΡΠ»ΠΈ s ΡΠ²Π»ΡΠ΅ΡΡΡ Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΎΠΉ.
Π‘Π»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΡ ΡΡΡΠΎΠΊΡ:
ΠΡΠ±Π°Ρ ΠΎΡΠΊΡΡΠ²Π°ΡΡΠ°Ρ ΡΠΊΠΎΠ±ΠΊΠ° '(' Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΡΡ Π·Π°ΠΊΡΡΠ²Π°ΡΡΡΡ ΡΠΊΠΎΠ±ΠΊΡ ')'.
ΠΡΠ±Π°Ρ Π·Π°ΠΊΡΡΠ²Π°ΡΡΠ°Ρ ΡΠΊΠΎΠ±ΠΊΠ° ')' Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΡΡ ΠΎΡΠΊΡΡΠ²Π°ΡΡΡΡ ΡΠΊΠΎΠ±ΠΊΡ '('.
ΠΡΠΊΡΡΠ²Π°ΡΡΠ°Ρ ΡΠΊΠΎΠ±ΠΊΠ° '(' Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠ΄ΡΠΈ ΠΏΠ΅ΡΠ΅Π΄ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΉ Π·Π°ΠΊΡΡΠ²Π°ΡΡΠ΅ΠΉ ΡΠΊΠΎΠ±ΠΊΠΎΠΉ ')'.
'*' ΠΌΠΎΠΆΠ΅Ρ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΡΡ ΠΊΠ°ΠΊ ΠΎΠ΄Π½Π° Π·Π°ΠΊΡΡΠ²Π°ΡΡΠ°Ρ ΡΠΊΠΎΠ±ΠΊΠ° ')', ΠΎΠ΄Π½Π° ΠΎΡΠΊΡΡΠ²Π°ΡΡΠ°Ρ ΡΠΊΠΎΠ±ΠΊΠ° '(' ΠΈΠ»ΠΈ ΠΏΡΡΡΠ°Ρ ΡΡΡΠΎΠΊΠ° "".
ΠΡΠΈΠΌΠ΅Ρ:
Input: s = "()"
Output: true
Example 2:
π¨βπ» ΠΠ»Π³ΠΎΡΠΈΡΠΌ:
1β£ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ 2D Π²Π΅ΠΊΡΠΎΡ memo ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ s.size() x s.size() - 1, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡΠΈΠΉ Π½Π΅ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅. ΠΡΠ·Π²Π°ΡΡ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ isValidString Ρ Π½Π°ΡΠ°Π»ΡΠ½ΡΠΌΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ index = 0, openCount = 0 ΠΈ ΡΡΡΠΎΠΊΠΎΠΉ s. ΠΠ΅ΡΠ½ΡΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ isValidString.
2β£ΠΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ isValidString. ΠΠ°Π·ΠΎΠ²ΡΠΉ ΡΠ»ΡΡΠ°ΠΉ: Π΅ΡΠ»ΠΈ index Π΄ΠΎΡΡΠΈΠ³ ΠΊΠΎΠ½ΡΠ° ΡΡΡΠΎΠΊΠΈ (index == s.size.), Π²Π΅ΡΠ½ΡΡΡ true, Π΅ΡΠ»ΠΈ openCount ΡΠ°Π²Π΅Π½ 0 (Π²ΡΠ΅ ΡΠΊΠΎΠ±ΠΊΠΈ ΡΠ±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²Π°Π½Ρ), ΠΈ false Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅. ΠΡΠΎΠ²Π΅ΡΠΈΡΡ, Π±ΡΠ» Π»ΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π΄Π»Ρ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ index ΠΈ openCount ΡΠΆΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ (ΠΌΠ΅ΠΌΠΎΠΈΠ·ΠΈΡΠΎΠ²Π°Π½) Π² memo. ΠΡΠ»ΠΈ Π΄Π°, Π²Π΅ΡΠ½ΡΡΡ ΠΌΠ΅ΠΌΠΎΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ. ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ isValid ΠΊΠ°ΠΊ false. ΠΡΠ»ΠΈ ΡΠ΅ΠΊΡΡΠΈΠΉ ΡΠΈΠΌΠ²ΠΎΠ» s[index] ΡΠ°Π²Π΅Π½ '*': ΠΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΡΡΠ°ΠΊΡΠΎΠ²Π°ΡΡ '*' ΠΊΠ°ΠΊ '(' ΠΈ Π²ΡΠ·Π²Π°ΡΡ isValidString ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎ Ρ index + 1 ΠΈ openCount + 1. ΠΡΠ»ΠΈ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΉ Π²ΡΠ·ΠΎΠ² Π²Π΅ΡΠ½Π΅Ρ true, ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ isValid Π½Π° true. ΠΡΠ»ΠΈ openCount Π½Π΅ ΡΠ°Π²Π΅Π½ Π½ΡΠ»Ρ, ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΡΡΠ°ΠΊΡΠΎΠ²Π°ΡΡ '*' ΠΊΠ°ΠΊ ')' ΠΈ Π²ΡΠ·Π²Π°ΡΡ isValidString ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎ Ρ index + 1 ΠΈ openCount - 1. ΠΡΠ»ΠΈ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΉ Π²ΡΠ·ΠΎΠ² Π²Π΅ΡΠ½Π΅Ρ true, ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ isValid Π½Π° true. ΠΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΡΡΠ°ΠΊΡΠΎΠ²Π°ΡΡ '*' ΠΊΠ°ΠΊ ΠΏΡΡΡΠΎΠΉ ΡΠΈΠΌΠ²ΠΎΠ» ΠΈ Π²ΡΠ·Π²Π°ΡΡ isValidString ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎ Ρ index + 1 ΠΈ ΡΠ΅ΠΌ ΠΆΠ΅ openCount. ΠΡΠ»ΠΈ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΉ Π²ΡΠ·ΠΎΠ² Π²Π΅ΡΠ½Π΅Ρ true, ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ isValid Π½Π° true.
3β£ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ isValidString. ΠΡΠ»ΠΈ ΡΠ΅ΠΊΡΡΠΈΠΉ ΡΠΈΠΌΠ²ΠΎΠ» s[index] ΡΠ°Π²Π΅Π½ '(': ΠΡΠ·Π²Π°ΡΡ isValidString ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎ Ρ index + 1 ΠΈ openCount + 1. ΠΠ±Π½ΠΎΠ²ΠΈΡΡ isValid Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π°. ΠΡΠ»ΠΈ ΡΠ΅ΠΊΡΡΠΈΠΉ ΡΠΈΠΌΠ²ΠΎΠ» s[index] ΡΠ°Π²Π΅Π½ ')': ΠΡΠ»ΠΈ openCount Π½Π΅ ΡΠ°Π²Π΅Π½ Π½ΡΠ»Ρ (Π΅ΡΡΡ ΠΎΡΠΊΡΡΡΡΠ΅ ΡΠΊΠΎΠ±ΠΊΠΈ), Π²ΡΠ·Π²Π°ΡΡ isValidString ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎ Ρ index + 1 ΠΈ openCount - 1. ΠΠ±Π½ΠΎΠ²ΠΈΡΡ isValid Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π°. ΠΠ΅ΠΌΠΎΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ isValid Π² memo[index][openCount]. ΠΠ΅ΡΠ½ΡΡΡ isValid.
π Π Π΅ΡΠ΅Π½ΠΈΠ΅:
class Solution {
public:
bool checkValidString(string s) {
vector<vector<int>> memo(s.size(), vector<int>(s.size(), -1));
return isValidString(0, 0, s, memo);
}
private:
bool isValidString(int index, int openCount, const string & str, vector < vector < int >> & memo) {
if (index == str.size()) {
return openCount == 0;
}
if (memo[index][openCount] != -1) {
return memo[index][openCount];
}
bool isValid = false;
if (str[index] == '*') {
isValid |= isValidString(index + 1, openCount + 1, str, memo);
if (openCount) {
isValid |= isValidString(index + 1, openCount - 1, str, memo);
}
isValid |= isValidString(index + 1, openCount, str, memo);
} else {
if (str[index] == '(') {
isValid = isValidString(index + 1, openCount + 1, str, memo);
} else if (openCount) {
isValid = isValidString(index + 1, openCount - 1, str, memo);
}
}
return memo[index][openCount] = isValid;
}
};
Π‘ΡΠ°Π²Ρ π ΠΈ Π·Π°Π±ΠΈΡΠ°ΠΉ π ΠΠ°Π·Ρ Π·Π½Π°Π½ΠΈΠΉ3 238
ΠΠ°Π΄Π°ΡΠ°: 1519. Number of Nodes in the Sub-Tree With the Same Label
Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡ: medium
ΠΠ°ΠΌ Π΄Π°Π½ΠΎ Π΄Π΅ΡΠ΅Π²ΠΎ (Ρ.Π΅. ΡΠ²ΡΠ·Π½ΡΠΉ Π½Π΅ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π³ΡΠ°Ρ Π±Π΅Π· ΡΠΈΠΊΠ»ΠΎΠ²), ΡΠΎΡΡΠΎΡΡΠ΅Π΅ ΠΈΠ· n ΡΠ·Π»ΠΎΠ², ΠΏΡΠΎΠ½ΡΠΌΠ΅ΡΠΎΠ²Π°Π½Π½ΡΡ
ΠΎΡ 0 Π΄ΠΎ n - 1, ΠΈ ΡΠΎΠ²Π½ΠΎ n - 1 ΡΠ΅Π±ΡΠ°. ΠΠΎΡΠ½Π΅ΠΌ Π΄Π΅ΡΠ΅Π²Π° ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ·Π΅Π» 0, ΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ·Π΅Π» Π΄Π΅ΡΠ΅Π²Π° ΠΈΠΌΠ΅Π΅Ρ ΠΌΠ΅ΡΠΊΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΡΠΎΡΠ½ΠΎΠΉ Π±ΡΠΊΠ²ΠΎΠΉ, ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π² ΡΡΡΠΎΠΊΠ΅ labels (Ρ.Π΅. ΡΠ·Π΅Π» Ρ Π½ΠΎΠΌΠ΅ΡΠΎΠΌ i ΠΈΠΌΠ΅Π΅Ρ ΠΌΠ΅ΡΠΊΡ labels[i]).
ΠΠ°ΡΡΠΈΠ² edges Π΄Π°Π½ Π² ΡΠΎΡΠΌΠ΅ edges[i] = [ai, bi], ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠ΅Π±ΡΠΎ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ·Π»Π°ΠΌΠΈ ai ΠΈ bi Π² Π΄Π΅ΡΠ΅Π²Π΅.
ΠΠ΅ΡΠ½ΠΈΡΠ΅ ΠΌΠ°ΡΡΠΈΠ² ΡΠ°Π·ΠΌΠ΅ΡΠ° n, Π³Π΄Π΅ ans[i] β ΡΡΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ·Π»ΠΎΠ² Π² ΠΏΠΎΠ΄Π΄Π΅ΡΠ΅Π²Π΅ ΡΠ·Π»Π° i, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠΌΠ΅ΡΡ ΡΡ ΠΆΠ΅ ΠΌΠ΅ΡΠΊΡ, ΡΡΠΎ ΠΈ ΡΠ·Π΅Π» i.
ΠΠΎΠ΄Π΄Π΅ΡΠ΅Π²ΠΎ Π΄Π΅ΡΠ΅Π²Π° T β ΡΡΠΎ Π΄Π΅ΡΠ΅Π²ΠΎ, ΡΠΎΡΡΠΎΡΡΠ΅Π΅ ΠΈΠ· ΡΠ·Π»Π° Π² T ΠΈ Π²ΡΠ΅Ρ
Π΅Π³ΠΎ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ
ΡΠ·Π»ΠΎΠ².
ΠΡΠΈΠΌΠ΅Ρ:
Input: n = 7, edges = [[0,1],[0,2],[1,4],[1,5],[2,3],[2,6]], labels = "abaedcd"
Output: [2,1,1,1,1,1,1]
Explanation: Node 0 has label 'a' and its sub-tree has node 2 with label 'a' as well, thus the answer is 2. Notice that any node is part of its sub-tree.
Node 1 has a label 'b'. The sub-tree of node 1 contains nodes 1,4 and 5, as nodes 4 and 5 have different labels than node 1, the answer is just 1 (the node itself).
π¨βπ» ΠΠ»Π³ΠΎΡΠΈΡΠΌ:
1β£Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠΏΠΈΡΠΎΠΊ ΡΠΌΠ΅ΠΆΠ½ΠΎΡΡΠΈ, Π³Π΄Π΅ adj[X] ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π²ΡΠ΅Ρ
ΡΠΎΡΠ΅Π΄Π΅ΠΉ ΡΠ·Π»Π° X.
2β£ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠΉΡΠ΅ ΠΌΠ°ΡΡΠΈΠ² ans, Ρ
ΡΠ°Π½ΡΡΠΈΠΉ ΠΎΡΠ²Π΅Ρ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ·Π»Π°, ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡΠ΅ Π΅Π³ΠΎ Π½ΡΠ»ΡΠΌΠΈ.
3β£ΠΠ°ΡΠ½ΠΈΡΠ΅ ΠΎΠ±Ρ
ΠΎΠ΄ Π² Π³Π»ΡΠ±ΠΈΠ½Ρ (DFS).
π Π Π΅ΡΠ΅Π½ΠΈΠ΅:
class Solution {
public:
vector<int> dfs(int node, int parent, unordered_map<int, vector<int>>& adj, string& labels, vector<int>& ans) {
vector<int> nodeCounts(26, 0);
nodeCounts[labels[node] - 'a'] = 1;
for (int child : adj[node]) {
if (child == parent) {
continue;
}
vector<int> childCounts = dfs(child, node, adj, labels, ans);
for (int i = 0; i < 26; i++) {
nodeCounts[i] += childCounts[i];
}
}
ans[node] = nodeCounts[labels[node] - 'a'];
return nodeCounts;
}
vector<int> countSubTrees(int n, vector<vector<int>>& edges, string labels) {
unordered_map<int, vector<int>> adj;
for (auto& edge : edges) {
adj[edge[0]].push_back(edge[1]);
adj[edge[1]].push_back(edge[0]);
}
vector<int> ans(n, 0);
dfs(0, -1, adj, labels, ans);
return ans;
}
};
Π‘ΡΠ°Π²Ρ π ΠΈ Π·Π°Π±ΠΈΡΠ°ΠΉ π ΠΠ°Π·Ρ Π·Π½Π°Π½ΠΈΠΉ3 238
ΠΠ°Π΄Π°ΡΠ°: 1061. Lexicographically Smallest Equivalent String
Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡ: medium
ΠΠ°Π½Ρ Π΄Π²Π΅ ΡΡΡΠΎΠΊΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ s1 ΠΈ s2, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΡΡΠΎΠΊΠ° baseStr.
ΠΡ Π³ΠΎΠ²ΠΎΡΠΈΠΌ, ΡΡΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Ρ s1[i] ΠΈ s2[i] ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½Ρ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ s1 = "abc" ΠΈ s2 = "cde", ΡΠΎ 'a' == 'c', 'b' == 'd' ΠΈ 'c' == 'e'. ΠΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ ΡΠ»Π΅Π΄ΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌ ΡΠ΅ΡΠ»Π΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ, ΡΠΈΠΌΠΌΠ΅ΡΡΠΈΠΈ ΠΈ ΡΡΠ°Π½Π·ΠΈΡΠΈΠ²Π½ΠΎΡΡΠΈ.
ΠΠ΅ΡΠ½ΠΈΡΠ΅ Π»Π΅ΠΊΡΠΈΠΊΠΎΠ³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π½Π°ΠΈΠΌΠ΅Π½ΡΡΡΡ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΡΡ ΡΡΡΠΎΠΊΡ baseStr, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΠ± ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΠΎΡΡΠΈ ΠΈΠ· s1 ΠΈ s2.
ΠΡΠΈΠΌΠ΅Ρ:
Input: s1 = "parker", s2 = "morris", baseStr = "parser"
Output: "makkek"
Explanation: Based on the equivalency information in s1 and s2, we can group their characters as [m,p], [a,o], [k,r,s], [e,i].
The characters in each group are equivalent and sorted in lexicographical order.
So the answer is "makkek".
π¨βπ» ΠΠ»Π³ΠΎΡΠΈΡΠΌ:
1β£Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΠΌΠ°ΡΡΠΈΡΡ ΡΠΌΠ΅ΠΆΠ½ΠΎΡΡΠΈ adjMatrix ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ 26x26 Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ ΡΡΠ±Π΅Ρ ΠΈ ΠΌΠ°ΡΡΠΈΠ² visited Π΄Π»Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ ΠΏΠΎΡΠ΅ΡΡΠ½Π½ΡΡ
ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ².
2β£ΠΡΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΠΉΡΠ΅ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ» ΠΎΡ 0 Π΄ΠΎ 25:
ΠΡΠ»ΠΈ ΡΠΈΠΌΠ²ΠΎΠ» Π΅ΡΡ Π½Π΅ ΠΏΠΎΡΠ΅ΡΡΠ½, Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ DFS, Π½Π°ΡΠΈΠ½Π°Ρ Ρ ΡΡΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π°, ΠΈ ΡΠΎΡ
ΡΠ°Π½ΠΈΡΠ΅ Π²ΡΠ΅ ΠΏΡΠΎΠΉΠ΄Π΅Π½Π½ΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ Π² Π²Π΅ΠΊΡΠΎΡΠ΅ component, Π° ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ· ΡΡΠΈΡ
ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ minChar.
ΠΠ±Π½ΠΎΠ²ΠΈΡΠ΅ Π²ΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ ΠΈΠ· component Π΄ΠΎ minChar Π² Π²Π΅ΠΊΡΠΎΡΠ΅ mappingChar, ΠΊΠΎΡΠΎΡΡΠΉ Ρ
ΡΠ°Π½ΠΈΡ ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΡΠΎΠΏΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² baseStr.
3β£ΠΡΠΎΠΉΠ΄ΠΈΡΠ΅ ΠΏΠΎ baseStr ΠΈ ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΠΈΡΠΎΠ³ΠΎΠ²ΡΡ ΡΡΡΠΎΠΊΡ ans, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠΈΠΌΠ²ΠΎΠ»Ρ ΠΈΠ· mappingChar.
π Π Π΅ΡΠ΅Π½ΠΈΠ΅:
class Solution {
public:
void DFS(int src, array<array<int, 26>, 26>& adjMatrix, array<int, 26>& visited, vector<int>& component, int& minChar) {
visited[src] = 1;
component.push_back(src);
minChar = min(minChar, src);
for (int i = 0; i < 26; i++) {
if (adjMatrix[src][i] && !visited[i]) {
DFS(i, adjMatrix, visited, component, minChar);
}
}
}
string smallestEquivalentString(string s1, string s2, string baseStr) {
array<array<int, 26>, 26> adjMatrix = {0};
for (int i = 0; i < s1.size(); i++) {
adjMatrix[s1[i] - 'a'][s2[i] - 'a'] = 1;
adjMatrix[s2[i] - 'a'][s1[i] - 'a'] = 1;
}
array<int, 26> mappingChar;
iota(mappingChar.begin(), mappingChar.end(), 0);
array<int, 26> visited = {0};
for (int c = 0; c < 26; c++) {
if (!visited[c]) {
vector<int> component;
int minChar = 27;
DFS(c, adjMatrix, visited, component, minChar);
for (int vertex : component) {
mappingChar[vertex] = minChar;
}
}
}
string ans;
for (char c : baseStr) {
ans += (char)(mappingChar[c - 'a'] + 'a');
}
return ans;
}
};
Π‘ΡΠ°Π²Ρ π ΠΈ Π·Π°Π±ΠΈΡΠ°ΠΉ π ΠΠ°Π·Ρ Π·Π½Π°Π½ΠΈΠΉ3 238
ΠΠ°Π΄Π°ΡΠ°: 1342. Number of Steps to Reduce a Number to Zero
Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡ: easy
ΠΠ°Π½ΠΎ ΡΠ΅Π»ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ num, Π²Π΅ΡΠ½ΡΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ°Π³ΠΎΠ², Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΡ
Π΄Π»Ρ Π΅Π³ΠΎ ΡΠΎΠΊΡΠ°ΡΠ΅Π½ΠΈΡ Π΄ΠΎ Π½ΡΠ»Ρ.
ΠΠ° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ°Π³Π΅, Π΅ΡΠ»ΠΈ ΡΠ΅ΠΊΡΡΠ΅Π΅ ΡΠΈΡΠ»ΠΎ ΡΠ΅ΡΠ½ΠΎΠ΅, Π΅Π³ΠΎ Π½ΡΠΆΠ½ΠΎ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΡ Π½Π° 2, Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΡΡΠ΅ΡΡΡ ΠΈΠ· Π½Π΅Π³ΠΎ 1.
ΠΡΠΈΠΌΠ΅Ρ:
Input: num = 14 Output: 6 Explanation: Step 1) 14 is even; divide by 2 and obtain 7. Step 2) 7 is odd; subtract 1 and obtain 6. Step 3) 6 is even; divide by 2 and obtain 3. Step 4) 3 is odd; subtract 1 and obtain 2. Step 5) 2 is even; divide by 2 and obtain 1. Step 6) 1 is odd; subtract 1 and obtain 0.π¨βπ» ΠΠ»Π³ΠΎΡΠΈΡΠΌ: 1β£ΠΠ° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ°Π³Π΅ ΠΏΡΠΎΠ²Π΅ΡΡΠΉΡΠ΅, ΡΠ΅ΡΠ½ΠΎΠ΅ Π»ΠΈ ΡΠ΅ΠΊΡΡΠ΅Π΅ ΡΠΈΡΠ»ΠΎ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΎΡΡΠ°ΡΠΊΠ° ΠΎΡ Π΄Π΅Π»Π΅Π½ΠΈΡ (%). ΠΡΠ»ΠΈ ΡΠΈΡΠ»ΠΎ ΡΠ΅ΡΠ½ΠΎΠ΅ (number % 2 == 0), ΡΠ°Π·Π΄Π΅Π»ΠΈΡΠ΅ Π΅Π³ΠΎ Π½Π° 2. 2β£ΠΡΠ»ΠΈ ΡΠΈΡΠ»ΠΎ Π½Π΅ΡΠ΅ΡΠ½ΠΎΠ΅ (number % 2 == 1), Π²ΡΡΡΠΈΡΠ΅ ΠΈΠ· Π½Π΅Π³ΠΎ 1. 3β£ΠΠΎΡΠ»Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΡΡΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°ΠΉΡΠ΅ ΡΡΠ΅ΡΡΠΈΠΊ ΡΠ°Π³ΠΎΠ² Π½Π° 1, ΡΡΠΎΠ±Ρ Π² ΠΊΠΎΠ½ΡΠ΅ Π²Π΅ΡΠ½ΡΡΡ Π΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. π Π Π΅ΡΠ΅Π½ΠΈΠ΅:
int numberOfSteps(int num) {
int steps = 0;
while (num != 0) {
if (num % 2 == 0) {
num /= 2;
} else {
num -= 1;
}
steps++;
}
return steps;
}
Π‘ΡΠ°Π²Ρ π ΠΈ Π·Π°Π±ΠΈΡΠ°ΠΉ π ΠΠ°Π·Ρ Π·Π½Π°Π½ΠΈΠΉ3 238
ΠΠ°Π΄Π°ΡΠ°: 285. Inorder Successor in BST
Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡ: medium
ΠΠ°Π½ ΠΊΠΎΡΠ΅Π½Ρ Π±ΠΈΠ½Π°ΡΠ½ΠΎΠ³ΠΎ Π΄Π΅ΡΠ΅Π²Π° ΠΏΠΎΠΈΡΠΊΠ° ΠΈ ΡΠ·Π΅Π» p Π² Π½Π΅ΠΌ. ΠΠ΅ΡΠ½ΠΈΡΠ΅ ΠΏΡΠ΅Π΅ΠΌΠ½ΠΈΠΊΠ° ΡΡΠΎΠ³ΠΎ ΡΠ·Π»Π° Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅ Π²ΠΎΠ·ΡΠ°ΡΡΠ°Π½ΠΈΡ Π² Π±ΠΈΠ½Π°ΡΠ½ΠΎΠΌ Π΄Π΅ΡΠ΅Π²Π΅ ΠΏΠΎΠΈΡΠΊΠ° (BST). ΠΡΠ»ΠΈ Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ·Π»Π° Π½Π΅Ρ ΠΏΡΠ΅Π΅ΠΌΠ½ΠΈΠΊΠ° Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅ Π²ΠΎΠ·ΡΠ°ΡΡΠ°Π½ΠΈΡ Π² Π΄Π΅ΡΠ΅Π²Π΅, Π²Π΅ΡΠ½ΠΈΡΠ΅ null.
ΠΡΠ΅Π΅ΠΌΠ½ΠΈΠΊ ΡΠ·Π»Π° p β ΡΡΠΎ ΡΠ·Π΅Π» Ρ Π½Π°ΠΈΠΌΠ΅Π½ΡΡΠΈΠΌ ΠΊΠ»ΡΡΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΠΎΠ»ΡΡΠ΅ p.val.
ΠΡΠΈΠΌΠ΅Ρ:
Input: root = [2,1,3], p = 1 Output: 2 Explanation: 1's in-order successor node is 2. Note that both p and the return value is of TreeNode type.π¨βπ» ΠΠ»Π³ΠΎΡΠΈΡΠΌ: 1β£ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΊΠ»Π°ΡΡΠ°: ΠΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΠ΅ Π΄Π²Π΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΊΠ»Π°ΡΡΠ°: previous ΠΈ inorderSuccessorNode. ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ previous Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΏΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ Π²ΡΠΎΡΠΎΠ³ΠΎ ΡΠ»ΡΡΠ°Ρ, Π° inorderSuccessorNode Π±ΡΠ΄Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π½ΡΠΆΠ½ΠΎ Π²Π΅ΡΠ½ΡΡΡ. 2β£ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π΄Π²ΡΡ ΡΠ»ΡΡΠ°Π΅Π²: Π ΡΡΠ½ΠΊΡΠΈΠΈ inorderSuccessor ΡΠ½Π°ΡΠ°Π»Π° ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· Π΄Π²ΡΡ ΡΠ»ΡΡΠ°Π΅Π² Π½ΡΠΆΠ½ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ, ΠΏΡΠΎΠ²Π΅ΡΡΡ Π½Π°Π»ΠΈΡΠΈΠ΅ ΠΏΡΠ°Π²ΠΎΠ³ΠΎ Π΄ΠΎΡΠ΅ΡΠ½Π΅Π³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°. ΠΡΠ°Π²ΡΠΉ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ: - ΠΏΡΠΈΡΠ²ΠΎΠΉΡΠ΅ ΠΏΡΠ°Π²ΡΠΉ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΠ·Π»Ρ leftmost ΠΈ ΠΈΡΠ΅ΡΠΈΡΡΠΉΡΠ΅ΡΡ, ΠΏΠΎΠΊΠ° Π½Π΅ Π΄ΠΎΡΡΠΈΠ³Π½Π΅ΡΠ΅ ΡΠ·Π»Π° (leftmost), Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π½Π΅Ρ Π»Π΅Π²ΠΎΠ³ΠΎ Π΄ΠΎΡΠ΅ΡΠ½Π΅Π³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°. ΠΡΠ΅ΡΠΈΡΡΠΉΡΠ΅, ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Ρ leftmost = leftmost.left, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π»Π΅Π²ΡΠΉ ΡΠ·Π΅Π» Π² ΠΏΠΎΠ΄Π΄Π΅ΡΠ΅Π²Π΅. ΠΡΠ°Π²ΡΠΉ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ: - ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ inorderCase2 ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΠΉΡΠ΅ Π΅ΠΉ ΡΠ·Π΅Π» ΠΈ ΡΠ·Π΅Π» p. - Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΠΏΡΠΎΡΡΠΎΠΉ ΠΎΠ±Ρ ΠΎΠ΄ Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅ Π²ΠΎΠ·ΡΠ°ΡΡΠ°Π½ΠΈΡ: ΡΠ½Π°ΡΠ°Π»Π° ΡΠ΅ΠΊΡΡΡΠΈΡΡΠΉΡΠ΅ Π½Π° Π»Π΅Π²ΡΠΉ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΠ·Π»Π°. - ΠΊΠΎΠ³Π΄Π° ΡΠ΅ΠΊΡΡΡΠΈΡ Π²Π΅ΡΠ½Π΅ΡΡΡ, ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅, ΡΠ°Π²Π½Π° Π»ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΠΊΠ»Π°ΡΡΠ° previous ΡΠ·Π»Ρ p. ΠΡΠ»ΠΈ ΡΡΠΎ ΡΠ°ΠΊ, Π·Π½Π°ΡΠΈΡ p ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠ΅Π΄ΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΈΠΊΠΎΠΌ ΡΠ·Π»Π°, ΠΈΠ»ΠΈ, Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΡΠ·Π΅Π» ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠ΅Π΅ΠΌΠ½ΠΈΠΊΠΎΠΌ ΡΠ·Π»Π° p. ΠΠ°Π·Π½Π°ΡΡΡΠ΅ inorderSuccessorNode ΡΠ·Π»Ρ ΠΈ Π²Π΅ΡΠ½ΠΈΡΠ΅ΡΡ ΠΈΠ· ΡΡΠ½ΠΊΡΠΈΠΈ. - Π½Π°ΠΊΠΎΠ½Π΅Ρ, Π²Π΅ΡΠ½ΠΈΡΠ΅ inorderSuccessorNode ΠΊΠ°ΠΊ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ. 3β£ΠΡΠ΅ΡΠ°ΡΠΈΡ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅: Π ΡΡΠ½ΠΊΡΠΈΠΈ inorderCase2 ΠΎΠ±Π½ΠΎΠ²Π»ΡΠΉΡΠ΅ previous ΡΠ΅ΠΊΡΡΠΈΠΌ ΡΠ·Π»ΠΎΠΌ ΠΈ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΠΉΡΠ΅ ΡΠ΅ΠΊΡΡΡΠΈΡΠΎΠ²Π°ΡΡ Π½Π° ΠΏΡΠ°Π²ΡΠΉ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ. π Π Π΅ΡΠ΅Π½ΠΈΠ΅:
class TreeNode {
public:
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
private:
TreeNode* previous;
TreeNode* inorderSuccessorNode;
public:
Solution() : previous(nullptr), inorderSuccessorNode(nullptr) {}
TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) {
if (p->right != nullptr) {
TreeNode* leftmost = p->right;
while (leftmost->left != nullptr) {
leftmost = leftmost->left;
}
inorderSuccessorNode = leftmost;
} else {
inorderCase2(root, p);
}
return inorderSuccessorNode;
}
private:
void inorderCase2(TreeNode* node, TreeNode* p) {
if (node == nullptr) {
return;
}
inorderCase2(node->left, p);
if (previous == p && inorderSuccessorNode == nullptr) {
inorderSuccessorNode = node;
return;
}
previous = node;
inorderCase2(node->right, p);
}
};
Π‘ΡΠ°Π²Ρ π ΠΈ Π·Π°Π±ΠΈΡΠ°ΠΉ π ΠΠ°Π·Ρ Π·Π½Π°Π½ΠΈΠΉ3 238
ΠΠ°Π΄Π°ΡΠ°: 642. Design Search Autocomplete System
Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡ: hard
Π Π°Π·ΡΠ°Π±ΠΎΡΠ°ΠΉΡΠ΅ ΡΠ²ΠΎΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΡΡΠ³ΠΎΠ²ΠΎΠΉ Π΄Π²ΡΡΡΠΎΡΠΎΠ½Π½Π΅ΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ (deque). Π Π΅Π°Π»ΠΈΠ·ΡΠΉΡΠ΅ ΠΊΠ»Π°ΡΡ MyCircularDeque: MyCircularDeque(int k) ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ deque Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΌ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ k. boolean insertFront() ΠΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π² ΠΏΠ΅ΡΠ΅Π΄Π½ΡΡ ΡΠ°ΡΡΡ Deque. ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ true, Π΅ΡΠ»ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΏΡΠΎΡΠ»Π° ΡΡΠΏΠ΅ΡΠ½ΠΎ, ΠΈΠ»ΠΈ false Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅. boolean insertLast() ΠΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π² Π·Π°Π΄Π½ΡΡ ΡΠ°ΡΡΡ Deque. ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ true, Π΅ΡΠ»ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π° ΡΡΠΏΠ΅ΡΠ½ΠΎ, ΠΈΠ»ΠΈ false Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅. boolean deleteFront() Π£Π΄Π°Π»ΡΠ΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΈΠ· ΠΏΠ΅ΡΠ΅Π΄Π½Π΅ΠΉ ΡΠ°ΡΡΠΈ Deque. ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ true, Π΅ΡΠ»ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΏΡΠΎΡΠ»Π° ΡΡΠΏΠ΅ΡΠ½ΠΎ, ΠΈΠ»ΠΈ false Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅. boolean deleteLast() Π£Π΄Π°Π»ΡΠ΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΈΠ· Π·Π°Π΄Π½Π΅ΠΉ ΡΠ°ΡΡΠΈ Deque. ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ true, Π΅ΡΠ»ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΏΡΠΎΡΠ»Π° ΡΡΠΏΠ΅ΡΠ½ΠΎ, ΠΈΠ»ΠΈ false Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅. int getFront() ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π½ΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΈΠ· Deque. ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ -1, Π΅ΡΠ»ΠΈ Deque ΠΏΡΡΡ. int getRear() ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΈΠ· Deque. ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ -1, Π΅ΡΠ»ΠΈ Deque ΠΏΡΡΡ.
ΠΡΠΈΠΌΠ΅Ρ:
Input ["MyCircularDeque", "insertLast", "insertLast", "insertFront", "insertFront", "getRear", "isFull", "deleteLast", "insertFront", "getFront"] [[3], [1], [2], [3], [4], [], [], [], [4], []] Output [null, true, true, true, false, 2, true, true, true, 4]π¨βπ» ΠΠ»Π³ΠΎΡΠΈΡΠΌ: 1β£ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ: Π Π΅Π°Π»ΠΈΠ·ΡΠΉΡΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Π΄Π»Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠΎΠ»ΡΡΠ΅Π²ΠΎΠΉ Π΄Π²ΡΡΡΠΎΡΠΎΠ½Π½Π΅ΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΈ ΠΌΠ΅ΡΠΎΠ΄Ρ Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΏΡΡΡΠΎΡΡ ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ. 2β£ΠΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π²ΡΡΠ°Π²ΠΊΠΈ: Π Π΅Π°Π»ΠΈΠ·ΡΠΉΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ Π²ΡΡΠ°Π²ΠΊΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π² ΠΏΠ΅ΡΠ΅Π΄Π½ΡΡ ΠΈ Π·Π°Π΄Π½ΡΡ ΡΠ°ΡΡΠΈ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Ρ ΡΡΠ΅ΡΠΎΠΌ ΠΊΠΎΠ»ΡΡΠ΅Π²ΠΎΠΉ ΡΡΡΡΠΊΡΡΡΡ. 3β£ΠΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ: Π Π΅Π°Π»ΠΈΠ·ΡΠΉΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΈΠ· ΠΏΠ΅ΡΠ΅Π΄Π½Π΅ΠΉ ΠΈ Π·Π°Π΄Π½Π΅ΠΉ ΡΠ°ΡΡΠ΅ΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Ρ ΡΡΠ΅ΡΠΎΠΌ ΠΊΠΎΠ»ΡΡΠ΅Π²ΠΎΠΉ ΡΡΡΡΠΊΡΡΡΡ ΠΈ ΠΌΠ΅ΡΠΎΠ΄Ρ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅Π΄Π½Π΅Π³ΠΎ ΠΈ Π·Π°Π΄Π½Π΅Π³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ. π Π Π΅ΡΠ΅Π½ΠΈΠ΅:
class AutocompleteSystem {
public:
AutocompleteSystem(vector<string>& sentences, vector<int>& times) {
root = new TrieNode();
current = root;
for (int i = 0; i < sentences.size(); ++i) {
add(sentences[i], times[i]);
}
}
vector<string> input(char c) {
if (c == '#') {
add(currentPrefix, 1);
currentPrefix = "";
current = root;
return {};
}
currentPrefix += c;
if (current->children.find(c) == current->children.end()) {
current->children[c] = new TrieNode();
}
current = current->children[c];
return search(current);
}
private:
struct TrieNode {
unordered_map<char, TrieNode*> children;
unordered_map<string, int> count;
};
TrieNode* root;
TrieNode* current;
string currentPrefix;
void add(const string& sentence, int times) {
TrieNode* node = root;
for (char c : sentence) {
if (node->children.find(c) == node->children.end()) {
node->children[c] = new TrieNode();
}
node = node->children[c];
node->count[sentence] += times;
}
}
vector<string> search(TrieNode* node) {
priority_queue<pair<int, string>> pq;
for (const auto& p : node->count) {
pq.push({p.second, p.first});
if (pq.size() > 3) {
pq.pop();
}
}
vector<string> result(pq.size());
for (int i = pq.size() - 1; i >= 0; --i) {
result[i] = pq.top().second;
pq.pop();
}
return result;
}
};
this.prefix += c;
let node = this.root;
for (const char of this.prefix) {
if (!node.children.has(char)) {
return [];
}
node = node.children.get(char);
}
const pq = Array.from(node.count.entries()).sort((a, b) => {
if (b[1] === a[1]) {
return a[0].localeCompare(b[0]);
} else {
return b[1] - a[1];
}
});
Π‘ΡΠ°Π²Ρ π ΠΈ Π·Π°Π±ΠΈΡΠ°ΠΉ π ΠΠ°Π·Ρ Π·Π½Π°Π½ΠΈΠΉ3 238
ΠΠ°Π΄Π°ΡΠ°: 787. Cheapest Flights Within K Stops
Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡ: medium
ΠΡΡΡ n Π³ΠΎΡΠΎΠ΄ΠΎΠ², ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΡ
Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΡΠ΅ΠΉΡΠΎΠ². ΠΠ°ΠΌ Π΄Π°Π½ ΠΌΠ°ΡΡΠΈΠ² flights, Π³Π΄Π΅ flights[i] = [fromi, toi, pricei] ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° ΡΠΎ, ΡΡΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠ΅ΠΉΡ ΠΈΠ· Π³ΠΎΡΠΎΠ΄Π° fromi Π² Π³ΠΎΡΠΎΠ΄ toi Ρ ΡΠ΅Π½ΠΎΠΉ pricei.
Π’Π°ΠΊΠΆΠ΅ Π΄Π°Π½Ρ ΡΡΠΈ ΡΠ΅Π»ΡΡ
ΡΠΈΡΠ»Π° src, dst ΠΈ k. ΠΠ΅ΡΠ½ΠΈΡΠ΅ ΡΠ°ΠΌΡΡ Π΄Π΅ΡΠ΅Π²ΡΡ ΡΠ΅Π½Ρ ΠΎΡ src Π΄ΠΎ dst Ρ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΠΌ k ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠ°ΠΌΠΈ. ΠΡΠ»ΠΈ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΌΠ°ΡΡΡΡΡΠ° Π½Π΅Ρ, Π²Π΅ΡΠ½ΠΈΡΠ΅ -1.
ΠΡΠΈΠΌΠ΅Ρ:
Input: n = 4, flights = [[0,1,100],[1,2,100],[2,0,100],[1,3,600],[2,3,200]], src = 0, dst = 3, k = 1 Output: 700 Explanation: The graph is shown above. The optimal path with at most 1 stop from city 0 to 3 is marked in red and has cost 100 + 600 = 700. Note that the path through cities [0,1,2,3] is cheaper but is invalid because it uses 2 stops.π¨βπ» ΠΠ»Π³ΠΎΡΠΈΡΠΌ: 1β£Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠΏΠΈΡΠΎΠΊ ΡΠΌΠ΅ΠΆΠ½ΠΎΡΡΠΈ, Π³Π΄Π΅ adj[X] ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π²ΡΠ΅Ρ ΡΠΎΡΠ΅Π΄Π΅ΠΉ ΡΠ·Π»Π° X ΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΡΡ ΡΠ΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΡ Π½ΡΠΆΠ½ΠΎ Π·Π°ΠΏΠ»Π°ΡΠΈΡΡ, ΡΡΠΎΠ±Ρ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ ΠΊ ΡΠΎΡΠ΅Π΄Ρ. ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠΉΡΠ΅ ΠΌΠ°ΡΡΠΈΠ² dist, Ρ ΡΠ°Π½ΡΡΠΈΠΉ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΡ ΡΠ΅Π½Ρ Π΄Π»Ρ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΡ ΡΠ·Π»Π° ΠΈΠ· ΡΠ·Π»Π° src. ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠΉΡΠ΅ Π΅Π³ΠΎ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ. ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠΉΡΠ΅ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, Ρ ΡΠ°Π½ΡΡΡΡ ΠΏΠ°ΡΡ {node, distance}. ΠΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ {src, 0}. Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ stops ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ Π΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π²Π½ΡΠΌ 0. 2β£ΠΡΠΏΠΎΠ»Π½ΡΠΉΡΠ΅ ΠΏΠΎΠΈΡΠΊ Π² ΡΠΈΡΠΈΠ½Ρ (BFS), ΠΏΠΎΠΊΠ° ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π½Π΅ ΡΡΠ°Π½Π΅Ρ ΠΏΡΡΡΠΎΠΉ ΠΈΠ»ΠΈ ΠΏΠΎΠΊΠ° stops > k. ΠΡΠ΅ΡΠΈΡΡΠΉΡΠ΅ ΠΏΠΎ Π²ΡΠ΅ΠΌ ΡΠ·Π»Π°ΠΌ Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ ΡΡΠΎΠ²Π½Π΅. ΠΡΠΎ Π±ΡΠ΄Π΅Ρ ΡΠ΄Π΅Π»Π°Π½ΠΎ ΠΏΡΡΠ΅ΠΌ Π·Π°ΠΏΡΡΠΊΠ° Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π° ΠΈ ΠΏΠΎΡΠ΅ΡΠ΅Π½ΠΈΡ Π²ΡΠ΅Ρ ΡΠ·Π»ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ. Π ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ°ΡΠ΅ {node, distance} ΠΈΡΠ΅ΡΠΈΡΡΠΉΡΠ΅ ΠΏΠΎ Π²ΡΠ΅ΠΌ ΡΠΎΡΠ΅Π΄ΡΠΌ ΡΠ·Π»Π°. ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΎΡΠ΅Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅, ΠΌΠ΅Π½ΡΡΠ΅ Π»ΠΈ dist[neighbor] ΡΠ΅ΠΌ distance + ΡΠ΅Π½Π° ΡΠ΅Π±ΡΠ°. ΠΡΠ»ΠΈ ΡΡΠΎ ΡΠ°ΠΊ, ΠΎΠ±Π½ΠΎΠ²ΠΈΡΠ΅ dist[neighbor] ΠΈ Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ {neighbor, dist[neighbor]} Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ. 3β£ΠΠΎΡΠ»Π΅ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌ ΡΠ·Π»Π°ΠΌ Π½Π° ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΡΡΠΎΠ²Π½Π΅ ΡΠ²Π΅Π»ΠΈΡΡΡΠ΅ stops Π½Π° ΠΎΠ΄ΠΈΠ½. ΠΡ ΠΏΠΎΡΠ΅ΡΠΈΠ»ΠΈ Π²ΡΠ΅ ΡΠ·Π»Ρ Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ ΡΡΠΎΠ²Π½Π΅ ΠΈ Π³ΠΎΡΠΎΠ²Ρ ΠΏΠΎΡΠ΅ΡΠΈΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΡΠΎΠ²Π΅Π½Ρ ΡΠ·Π»ΠΎΠ². ΠΠΎΠ³Π΄Π° ΠΌΡ Π΄ΠΎΡΡΠΈΠ³Π½Π΅ΠΌ ΡΡΠ»ΠΎΠ²ΠΈΡ, ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΠΎΠΌ Π»ΠΈΠ±ΠΎ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΡΡΠ°Π½Π΅Ρ ΠΏΡΡΡΠΎΠΉ, Π»ΠΈΠ±ΠΎ stops == k, Ρ Π½Π°Ρ Π±ΡΠ΄Π΅Ρ Π½Π°Ρ ΠΎΡΠ²Π΅Ρ Π² dist[dst]. ΠΡΠ»ΠΈ dist[dst] Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΎΡΡ Ρ Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, Π·Π½Π°ΡΠΈΡ, ΠΌΡ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π΄ΠΎΡΡΠΈΠ³Π»ΠΈ Π΅Π³ΠΎ, ΠΈ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π²Π΅ΡΠ½ΡΡΡ -1. π Π Π΅ΡΠ΅Π½ΠΈΠ΅:
class Solution {
public:
int findCheapestPrice(int n, vector<vector<int>>& flights, int src, int dst, int k) {
vector<vector<pair<int, int>>> adj(n);
for (auto& e : flights) {
adj[e[0]].push_back({e[1], e[2]});
}
vector<int> dist(n, numeric_limits<int>::max());
queue<pair<int, int>> q;
q.push({src, 0});
int stops = 0;
while (stops <= k && !q.empty()) {
int sz = q.size();
while (sz--) {
auto [node, distance] = q.front();
q.pop();
for (auto& [neighbour, price] : adj[node]) {
if (price + distance >= dist[neighbour]) continue;
dist[neighbour] = price + distance;
q.push({neighbour, dist[neighbour]});
}
}
stops++;
}
return dist[dst] == numeric_limits<int>::max() ? -1 : dist[dst];
}
};
Π‘ΡΠ°Π²Ρ π ΠΈ Π·Π°Π±ΠΈΡΠ°ΠΉ π ΠΠ°Π·Ρ Π·Π½Π°Π½ΠΈΠΉ3 238
Repost from easyoffer
ΠΠ°Π·Π° 1000+ ΡΠ΅Π°Π»ΡΠ½ΡΡ
ΡΠΎΠ±Π΅ΡΠ΅Π΄ΠΎΠ²Π°Π½ΠΈΠΉ ΡΠ΅ΠΏΠ΅ΡΡ Π²ΡΡΡΠΎΠ΅Π½Π° Π² easyoffer
Π‘ΠΌΠΎΡΡΠΈΡΠ΅, ΠΊΠ°ΠΊ Π΄ΡΡΠ³ΠΈΠ΅ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΡ ΠΎΡΠ²Π΅ΡΠ°ΡΡ Π½Π° Π²ΠΎΠΏΡΠΎΡΡ, ΡΠ΅ΡΠ°ΡΡ Π·Π°Π΄Π°ΡΠΈ ΠΈ ΠΏΡΠΎΡ
ΠΎΠ΄ΡΡ ΡΡΠ°ΠΏΡ Π½Π° ΡΠ΅Π°Π»ΡΠ½ΡΡ
ΡΠΎΠ±Π΅ΡΠ΅Π΄ΠΎΠ²Π°Π½ΠΈΡΡ
ΠΎΡ ΡΠΎΠΏΠΎΠ²ΡΡ
ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΉ. ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΡΡΠ΅ΡΡ ΠΊ ΡΠ²ΠΎΠ΅ΠΌΡ ΡΠΎΠ±Π΅ΡΠ΅Π΄ΠΎΠ²Π°Π½ΠΈΡ Ρ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ ΡΠ²Π΅ΡΠ΅Π½Π½ΠΎΡΡΡΡ.
ΠΠ°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ, ΡΡΠΎ ΡΠ΅Π³ΠΎΠ΄Π½Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ Π΄Π΅Π½Ρ Π§ΡΡΠ½ΠΎΠΉ ΠΡΡΠ½ΠΈΡΡ
π ΠΠ°Π±ΡΠ°ΡΡ PRO ΡΠΎ ΡΠΊΠΈΠ΄ΠΊΠΎΠΉ 70%: https://easyoffer.ru/
3 238
ΠΠ°Π΄Π°ΡΠ°: 1662. Check If Two String Arrays are Equivalent
Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡ: easy
ΠΠ°Π½Ρ Π΄Π²Π° ΠΌΠ°ΡΡΠΈΠ²Π° ΡΡΡΠΎΠΊ
word1 ΠΈ word2. ΠΠ΅ΡΠ½ΠΈΡΠ΅ true, Π΅ΡΠ»ΠΈ Π΄Π²Π° ΠΌΠ°ΡΡΠΈΠ²Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΠΎΠ΄Π½Ρ ΠΈ ΡΡ ΠΆΠ΅ ΡΡΡΠΎΠΊΡ, ΠΈ false Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅.
Π‘ΡΡΠΎΠΊΠ° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π° ΠΌΠ°ΡΡΠΈΠ²ΠΎΠΌ, Π΅ΡΠ»ΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΌΠ°ΡΡΠΈΠ²Π°, ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΠ΅ Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅, ΠΎΠ±ΡΠ°Π·ΡΡΡ ΡΡΡΠΎΠΊΡ.
ΠΡΠΈΠΌΠ΅Ρ:
Input: word1 = ["ab", "c"], word2 = ["a", "bc"]
Output: true
Explanation:
word1 represents string "ab" + "c" -> "abc"
word2 represents string "a" + "bc" -> "abc"
The strings are the same, so return true.
π¨βπ» ΠΠ»Π³ΠΎΡΠΈΡΠΌ:
1β£ΠΠΎΡΡΡΠΎΠ΅Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠ° ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Π΄Π»Ρ word2:
Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠΏΠΈΡΠΎΠΊ list2 Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ Π²ΡΠ΅Ρ
ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ΠΈΠ· ΠΌΠ°ΡΡΠΈΠ²Π° ΡΡΡΠΎΠΊ word2.
2β£ΠΡΠ΅ΡΠ°ΡΠΈΡ ΠΏΠΎ word1 ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΡ
ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ²:
ΠΡΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΎ ΠΏΡΠΎΠΉΠ΄ΠΈΡΠ΅ ΠΏΠΎ ΡΡΡΠΎΠΊΠ°ΠΌ Π² word1 ΠΈ ΡΡΠ°Π²Π½ΠΈΠ²Π°ΠΉΡΠ΅ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ» Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ ΠΈΠ· list2.
3β£ΠΠΎΠ·Π²ΡΠ°Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°:
ΠΠ΅ΡΠ½ΠΈΡΠ΅ true, Π΅ΡΠ»ΠΈ Π²ΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ, ΠΈ false, Π΅ΡΠ»ΠΈ Π½Π°ΠΉΠ΄Π΅Π½Ρ Π½Π΅ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π΄Π»ΠΈΠ½Ρ ΡΡΡΠΎΠΊ Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ.
π Π Π΅ΡΠ΅Π½ΠΈΠ΅:
class Solution {
public:
bool arrayStringsAreEqual(vector<string>& word1, vector<string>& word2) {
string list2;
for (const string& s : word2) {
list2 += s;
}
int index = 0;
int list2Length = list2.size();
for (const string& s : word1) {
for (char c : s) {
if (index >= list2Length || c != list2[index]) {
return false;
}
index++;
}
}
return index == list2Length;
}
};
Π‘ΡΠ°Π²Ρ π ΠΈ Π·Π°Π±ΠΈΡΠ°ΠΉ π ΠΠ°Π·Ρ Π·Π½Π°Π½ΠΈΠΉ3 238
ΠΠ°Π΄Π°ΡΠ°: 991. Broken Calculator
Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡ: medium
ΠΠΌΠ΅Π΅ΡΡΡ Π½Π΅ΠΈΡΠΏΡΠ°Π²Π½ΡΠΉ ΠΊΠ°Π»ΡΠΊΡΠ»ΡΡΠΎΡ, Π½Π° ΡΠΊΡΠ°Π½Π΅ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ ΡΠ΅Π»ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ startValue. ΠΠ° ΠΎΠ΄Π½Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ:
Π£ΠΌΠ½ΠΎΠΆΠΈΡΡ ΡΠΈΡΠ»ΠΎ Π½Π° ΡΠΊΡΠ°Π½Π΅ Π½Π° 2, ΠΈΠ»ΠΈ
ΠΡΡΠ΅ΡΡΡ 1 ΠΈΠ· ΡΠΈΡΠ»Π° Π½Π° ΡΠΊΡΠ°Π½Π΅.
ΠΠ°Π½Ρ Π΄Π²Π° ΡΠ΅Π»ΡΡ
ΡΠΈΡΠ»Π° startValue ΠΈ target. ΠΠ΅ΡΠ½ΠΈΡΠ΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΡ
Π΄Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ target Π½Π° ΠΊΠ°Π»ΡΠΊΡΠ»ΡΡΠΎΡΠ΅.
ΠΡΠΈΠΌΠ΅Ρ:
Input: startValue = 2, target = 3
Output: 2
Explanation: Use double operation and then decrement operation {2 -> 4 -> 3}.
π¨βπ» ΠΠ»Π³ΠΎΡΠΈΡΠΌ:
1β£ΠΠ±ΡΠ°ΡΠ½ΡΠΉ ΠΏΡΡΡ:
ΠΡΠ»ΠΈ target Π±ΠΎΠ»ΡΡΠ΅ startValue, ΡΠΎ ΠΏΠΎΠΏΡΡΠ°ΠΉΡΠ΅ΡΡ ΡΠΌΠ΅Π½ΡΡΠΈΡΡ target, ΡΡΠΎΠ±Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ Π΅Π³ΠΎ ΠΊ startValue.
ΠΡΠ»ΠΈ target ΡΠ΅ΡΠ½ΡΠΉ, ΡΠ°Π·Π΄Π΅Π»ΠΈΡΠ΅ Π΅Π³ΠΎ Π½Π° 2, ΠΈΠ½Π°ΡΠ΅ ΠΏΡΠΈΠ±Π°Π²ΡΡΠ΅ 1.
2β£ΠΠΎΠ΄ΡΡΠ΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ:
ΠΠΎΠ²ΡΠΎΡΡΠΉΡΠ΅ ΡΠ°Π³ΠΈ, ΠΏΠΎΠΊΠ° target Π½Π΅ ΡΡΠ°Π½Π΅Ρ ΠΌΠ΅Π½ΡΡΠ΅ ΠΈΠ»ΠΈ ΡΠ°Π²Π΅Π½ startValue.
ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π²ΡΡΠΈΡΠ°ΠΉΡΠ΅ ΠΈΠ· startValue ΠΎΡΡΠ°Π²ΡΠ΅Π΅ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ target.
3β£ΠΠΎΠ·Π²ΡΠ°Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°:
ΠΠΎΠ·Π²ΡΠ°ΡΠ°ΠΉΡΠ΅ ΡΡΠΌΠΌΠ°ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π½ΡΡ
ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ.
π Π Π΅ΡΠ΅Π½ΠΈΠ΅:
class Solution {
public:
int brokenCalc(int startValue, int target) {
int operations = 0;
while (target > startValue) {
operations++;
if (target % 2 == 0) {
target /= 2;
} else {
target += 1;
}
}
return operations + (startValue - target);
}
};
Π‘ΡΠ°Π²Ρ π ΠΈ Π·Π°Π±ΠΈΡΠ°ΠΉ π ΠΠ°Π·Ρ Π·Π½Π°Π½ΠΈΠΉ3 238
ΠΠ°Π΄Π°ΡΠ°: 1033. Moving Stones Until Consecutive
Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡ: medium
ΠΠ° ΠΎΡΠΈ X ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Ρ ΡΡΠΈ ΠΊΠ°ΠΌΠ½Ρ Π² ΡΠ°Π·Π½ΡΡ
ΠΏΠΎΠ·ΠΈΡΠΈΡΡ
. ΠΠ°ΠΌ Π΄Π°Π½Ρ ΡΡΠΈ ΡΠ΅Π»ΡΡ
ΡΠΈΡΠ»Π° a, b ΠΈ c - ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΠΊΠ°ΠΌΠ½Π΅ΠΉ. ΠΠ° ΠΎΠ΄Π½ΠΎ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π²Ρ Π±Π΅ΡΠ΅ΡΠ΅ ΠΊΠ°ΠΌΠ΅Π½Ρ Π² ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΉ ΡΠΎΡΠΊΠ΅ (Ρ. Π΅. Π»ΠΈΠ±ΠΎ Π² ΡΠ°ΠΌΠΎΠΉ Π½ΠΈΠ·ΠΊΠΎΠΉ, Π»ΠΈΠ±ΠΎ Π² ΡΠ°ΠΌΠΎΠΉ Π²ΡΡΠΎΠΊΠΎΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΠΊΠ°ΠΌΠ½Ρ) ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅ΡΠ΅ Π΅Π³ΠΎ Π² Π½Π΅Π·Π°Π½ΡΡΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΠΈΠΌΠΈ ΠΊΠΎΠ½Π΅ΡΠ½ΡΠΌΠΈ ΡΠΎΡΠΊΠ°ΠΌΠΈ. Π€ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ, Π΄ΠΎΠΏΡΡΡΠΈΠΌ, ΠΊΠ°ΠΌΠ½ΠΈ Π² Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π½Π°Ρ
ΠΎΠ΄ΡΡΡΡ Π² ΠΏΠΎΠ·ΠΈΡΠΈΡΡ
x, y ΠΈ z, ΠΏΡΠΈΡΠ΅ΠΌ x < y < z. ΠΡ Π±Π΅ΡΠ΅ΡΠ΅ ΠΊΠ°ΠΌΠ΅Π½Ρ Π² ΠΏΠΎΠ·ΠΈΡΠΈΠΈ x ΠΈΠ»ΠΈ z ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅ΡΠ΅ Π΅Π³ΠΎ Π² ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΡ k, ΠΏΡΠΈΡΠ΅ΠΌ x < k < z ΠΈ k != y. ΠΠ³ΡΠ° Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Π΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° Π²Ρ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ΄Π΅Π»Π°ΡΡ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ
ΠΎΠ΄Π° (ΡΠΎ Π΅ΡΡΡ ΠΊΠ°ΠΌΠ½ΠΈ Π½Π°Ρ
ΠΎΠ΄ΡΡΡΡ Π² ΡΡΠ΅Ρ
ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΡ
ΠΏΠΎΠ·ΠΈΡΠΈΡΡ
). ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² answer Π΄Π»ΠΈΠ½Ρ 2, Π³Π΄Π΅: answer[0] - ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Ρ
ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΡΠ³ΡΠ°ΡΡ, Π° answer[1] - ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Ρ
ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΡΠ³ΡΠ°ΡΡ.
ΠΡΠΈΠΌΠ΅Ρ:
Input: a = 3, b = 5, c = 1 Output: [1,2]π¨βπ» ΠΠ»Π³ΠΎΡΠΈΡΠΌ: 1β£Π‘ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΏΠΎΠ·ΠΈΡΠΈΠΉ: Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΠΊΠ°ΠΌΠ½Π΅ΠΉ ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½Ρ Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅ Π²ΠΎΠ·ΡΠ°ΡΡΠ°Π½ΠΈΡ. ΠΠ±ΠΎΠ·Π½Π°ΡΠΈΠΌ ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΠΊΠ°ΠΊ x, y ΠΈ z. 2β£ΠΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΡ Ρ ΠΎΠ΄ΠΎΠ²: ΠΡΠ»ΠΈ ΠΊΠ°ΠΌΠ½ΠΈ ΡΠΆΠ΅ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΡΡ (ΡΠΎ Π΅ΡΡΡ y - x == 1 ΠΈ z - y == 1), ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Ρ ΠΎΠ΄ΠΎΠ² ΡΠ°Π²Π½ΠΎ 0. ΠΡΠ»ΠΈ Π΄Π²Π° ΠΊΠ°ΠΌΠ½Ρ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π² ΡΠΎΡΠ΅Π΄Π½ΠΈΡ ΠΏΠΎΠ·ΠΈΡΠΈΡΡ , Π° ΡΡΠ΅ΡΠΈΠΉ ΠΊΠ°ΠΌΠ΅Π½Ρ Π½Π° ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠΈ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΠΌ ΠΎΠ΄Π½Π° ΠΏΠΎΠ·ΠΈΡΠΈΡ, ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Ρ ΠΎΠ΄ΠΎΠ² ΡΠ°Π²Π½ΠΎ 1. Π ΠΎΡΡΠ°Π»ΡΠ½ΡΡ ΡΠ»ΡΡΠ°ΡΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Ρ ΠΎΠ΄ΠΎΠ² ΡΠ°Π²Π½ΠΎ 2. 3β£ΠΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΡ Ρ ΠΎΠ΄ΠΎΠ²: ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Ρ ΠΎΠ΄ΠΎΠ² ΡΠ°Π²Π½ΠΎ ΡΡΠΌΠΌΠ΅ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΡΠ΅Π΄Π½ΠΈΠΌΠΈ ΠΊΠ°ΠΌΠ½ΡΠΌΠΈ ΠΌΠΈΠ½ΡΡ 2, ΡΠΎ Π΅ΡΡΡ (y - x - 1) + (z - y - 1). π Π Π΅ΡΠ΅Π½ΠΈΠ΅:
vector<int> numMovesStones(int a, int b, int c) {
vector<int> stones = {a, b, c};
sort(stones.begin(), stones.end());
int x = stones[0], y = stones[1], z = stones[2];
int min_moves = (y - x <= 2 || z - y <= 2) ? ((y - x == 1 && z - y == 1) ? 0 : 1) : 2;
int max_moves = (y - x - 1) + (z - y - 1);
return {min_moves, max_moves};
}
Π‘ΡΠ°Π²Ρ π ΠΈ Π·Π°Π±ΠΈΡΠ°ΠΉ π ΠΠ°Π·Ρ Π·Π½Π°Π½ΠΈΠΉ3 238
ΠΠ°Π΄Π°ΡΠ°: 1339. Maximum Product of Splitted Binary Tree
Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡ: medium
ΠΠ°Π½ΠΎ ΠΊΠΎΡΠ½Π΅Π²ΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ. Π Π°Π·Π΄Π΅Π»ΠΈΡΠ΅ Π±ΠΈΠ½Π°ΡΠ½ΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ Π½Π° Π΄Π²Π° ΠΏΠΎΠ΄Π΄Π΅ΡΠ΅Π²Π°, ΡΠ΄Π°Π»ΠΈΠ² ΠΎΠ΄Π½ΠΎ ΡΠ΅Π±ΡΠΎ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΡΠΌΠΌ ΠΏΠΎΠ΄Π΄Π΅ΡΠ΅Π²ΡΠ΅Π² Π±ΡΠ»ΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΌ.
ΠΠ΅ΡΠ½ΠΈΡΠ΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΡΠΌΠΌ Π΄Π²ΡΡ
ΠΏΠΎΠ΄Π΄Π΅ΡΠ΅Π²ΡΠ΅Π². ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΡΠ²Π΅Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π±ΠΎΠ»ΡΡΠΈΠΌ, Π²Π΅ΡΠ½ΠΈΡΠ΅ Π΅Π³ΠΎ ΠΏΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ 10^9 + 7.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ ΡΠ²Π΅Π»ΠΈΡΠΈΡΡ ΠΎΡΠ²Π΅Ρ Π΄ΠΎ Π²Π·ΡΡΠΈΡ ΠΌΠΎΠ΄ΡΠ»Ρ, Π° Π½Π΅ ΠΏΠΎΡΠ»Π΅.
ΠΡΠΈΠΌΠ΅Ρ:
Input: root = [1,2,3,4,5,6] Output: 110 Explanation: Remove the red edge and get 2 binary trees with sum 11 and 10. Their product is 110 (11*10)π¨βπ» ΠΠ»Π³ΠΎΡΠΈΡΠΌ: 1β£Π Π°ΡΡΡΠΈΡΠ°ΡΡ ΡΡΠΌΠΌΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π²ΡΠ΅Ρ ΡΠ·Π»ΠΎΠ² Π΄Π΅ΡΠ΅Π²Π° ΠΈ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΡΡΠΌΠΌΡ Π²ΡΠ΅Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠ΅Π²ΡΠ΅Π² Π² ΡΠΏΠΈΡΠΊΠ΅. 2β£ΠΠ΅ΡΠ΅Π±ΡΠ°ΡΡ Π²ΡΠ΅ ΡΠΎΡ ΡΠ°Π½Π΅Π½Π½ΡΠ΅ ΡΡΠΌΠΌΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠ΅Π²ΡΠ΅Π² ΠΈ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²ΡΡΠΈΡΠ»ΠΈΡΡ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΡΠΌΠΌΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠ΅Π²Π° ΠΈ ΡΠ°Π·Π½ΠΎΡΡΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΎΠ±ΡΠ΅ΠΉ ΡΡΠΌΠΌΠΎΠΉ Π΄Π΅ΡΠ΅Π²Π° ΠΈ Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠΌΠΌΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠ΅Π²Π°. 3β£ΠΠ°ΠΉΡΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΡΠ΅Π΄ΠΈ Π²ΡΠ΅Ρ Π²ΡΡΠΈΡΠ»Π΅Π½Π½ΡΡ ΠΈ Π²Π΅ΡΠ½ΡΡΡ Π΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ 10^9 + 7. π Π Π΅ΡΠ΅Π½ΠΈΠ΅:
class Solution {
vector<int> allSums;
public:
int maxProduct(TreeNode* root) {
long totalSum = treeSum(root);
long best = 0;
for (long sum : allSums) {
best = max(best, sum * (totalSum - sum));
}
return (int)(best % 1000000007);
}
private:
int treeSum(TreeNode* subroot) {
if (!subroot) return 0;
int leftSum = treeSum(subroot->left);
int rightSum = treeSum(subroot->right);
int totalSum = leftSum + rightSum + subroot->val;
allSums.push_back(totalSum);
return totalSum;
}
};
Π‘ΡΠ°Π²Ρ π ΠΈ Π·Π°Π±ΠΈΡΠ°ΠΉ π ΠΠ°Π·Ρ Π·Π½Π°Π½ΠΈΠΉ3 238
Repost from easyoffer
Π§Π΅ΡΠ½Π°Ρ ΠΏΡΡΠ½ΠΈΡΠ° Π½Π° easyoffer
Π‘ΠΊΠΈΠ΄ΠΊΠ° 70% Π½Π° PRO Π΄ΠΎ 29 Π½ΠΎΡΠ±ΡΡ.
π https://easyoffer.ru/
3 238
ΠΠ°Π΄Π°ΡΠ°: 860. Lemonade Change
Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡ: easy
ΠΠ° Π»ΠΈΠΌΠΎΠ½Π°Π΄Π½ΠΎΠΉ ΡΡΠΎΠΉΠΊΠ΅ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π»ΠΈΠΌΠΎΠ½Π°Π΄ ΡΡΠΎΠΈΡ $5. ΠΠΎΠΊΡΠΏΠ°ΡΠ΅Π»ΠΈ ΡΡΠΎΡΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ, ΡΡΠΎΠ±Ρ ΠΊΡΠΏΠΈΡΡ Π»ΠΈΠΌΠΎΠ½Π°Π΄, ΠΈ Π·Π°ΠΊΠ°Π·ΡΠ²Π°ΡΡ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ (Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅, ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ bills). ΠΠ°ΠΆΠ΄ΡΠΉ ΠΏΠΎΠΊΡΠΏΠ°ΡΠ΅Π»Ρ ΠΏΠΎΠΊΡΠΏΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Π»ΠΈΠΌΠΎΠ½Π°Π΄ ΠΈ ΠΏΠ»Π°ΡΠΈΡ Π»ΠΈΠ±ΠΎ $5, $10, Π»ΠΈΠ±ΠΎ $20. ΠΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΡ ΡΠ΄Π°ΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΠΏΠΎΠΊΡΠΏΠ°ΡΠ΅Π»Ρ, ΡΡΠΎΠ±Ρ ΡΠΈΡΡΠ°Ρ ΡΠ΄Π΅Π»ΠΊΠ° Π±ΡΠ»Π° ΡΠ°ΠΊΠΎΠΉ, ΡΡΠΎ ΠΏΠΎΠΊΡΠΏΠ°ΡΠ΅Π»Ρ ΠΏΠ»Π°ΡΠΈΡ $5.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ Ρ Π²Π°Ρ Π½Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΡΠ΄Π°ΡΠΈ.
ΠΠ°Π½ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² bills, Π³Π΄Π΅ bills[i] β ΠΊΡΠΏΡΡΠ°, ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΠ»Π°ΡΠΈΡ i-ΠΉ ΠΏΠΎΠΊΡΠΏΠ°ΡΠ΅Π»Ρ. ΠΠ΅ΡΠ½ΠΈΡΠ΅ true, Π΅ΡΠ»ΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΠΏΠΎΠΊΡΠΏΠ°ΡΠ΅Π»Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΡ ΡΠ΄Π°ΡΡ, ΠΈΠ»ΠΈ false Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅.
ΠΡΠΈΠΌΠ΅Ρ:
Input: bills = [5,5,5,10,20]
Output: true
Explanation:
From the first 3 customers, we collect three $5 bills in order.
From the fourth customer, we collect a $10 bill and give back a $5.
From the fifth customer, we give a $10 bill and a $5 bill.
Since all customers got correct change, we output true.
π¨βπ» ΠΠ»Π³ΠΎΡΠΈΡΠΌ:
1β£ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΏΡΡΠ΅ΡΠΎΠΊ ΠΈ Π΄Π΅ΡΡΡΠΎΠΊ. ΠΡΠ»ΠΈ ΠΏΠΎΠΊΡΠΏΠ°ΡΠ΅Π»Ρ ΠΏΠ»Π°ΡΠΈΡ $5, Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΡΡΡ ΠΊΡΠΏΡΡΡ Π² Π½Π°Ρ Π·Π°ΠΏΠ°Ρ.
2β£ΠΡΠ»ΠΈ ΠΏΠΎΠΊΡΠΏΠ°ΡΠ΅Π»Ρ ΠΏΠ»Π°ΡΠΈΡ $10, ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ Π½Π°Π»ΠΈΡΠΈΠ΅ ΠΏΡΡΠ΅ΡΠΊΠΈ Π΄Π»Ρ ΡΠ΄Π°ΡΠΈ. ΠΡΠ»ΠΈ ΠΏΡΡΠ΅ΡΠΊΠΈ Π½Π΅Ρ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ false. Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, ΡΠΌΠ΅Π½ΡΡΠ°Π΅ΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΡΡΠ΅ΡΠΎΠΊ ΠΈ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΄Π΅ΡΡΡΠΎΠΊ.
3β£ΠΡΠ»ΠΈ ΠΏΠΎΠΊΡΠΏΠ°ΡΠ΅Π»Ρ ΠΏΠ»Π°ΡΠΈΡ $20, ΡΠ½Π°ΡΠ°Π»Π° ΠΏΡΡΠ°Π΅ΠΌΡΡ Π΄Π°ΡΡ ΡΠ΄Π°ΡΡ Π΄Π΅ΡΡΡΠΊΠΎΠΉ ΠΈ ΠΏΡΡΠ΅ΡΠΊΠΎΠΉ. ΠΡΠ»ΠΈ ΡΡΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ Π½Π°Π»ΠΈΡΠΈΠ΅ ΡΡΠ΅Ρ
ΠΏΡΡΠ΅ΡΠΎΠΊ. ΠΡΠ»ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π°ΡΡ ΡΠ΄Π°ΡΡ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ false. ΠΠΎΡΠ»Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π²ΡΠ΅Ρ
ΠΏΠΎΠΊΡΠΏΠ°ΡΠ΅Π»Π΅ΠΉ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ true.
π Π Π΅ΡΠ΅Π½ΠΈΠ΅:
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
int five = 0, ten = 0;
for (int bill : bills) {
if (bill == 5) {
five++;
} else if (bill == 10) {
if (five == 0) return false;
five--;
ten++;
} else {
if (five > 0 && ten > 0) {
five--;
ten--;
} else if (five >= 3) {
five -= 3;
} else {
return false;
}
}
}
return true;
}
};
Π‘ΡΠ°Π²Ρ π ΠΈ Π·Π°Π±ΠΈΡΠ°ΠΉ π ΠΠ°Π·Ρ Π·Π½Π°Π½ΠΈΠΉ3 238
ΠΠ°Π΄Π°ΡΠ°: 1063. Number of Valid Subarrays
Π‘Π»ΠΎΠΆΠ½ΠΎΡΡΡ: hard
ΠΠ°Π½ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² nums. ΠΠ΅ΡΠ½ΡΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π½Π΅ΠΏΡΡΡΡΡ
ΠΏΠΎΠ΄ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ², Π² ΠΊΠΎΡΠΎΡΡΡ
Π»Π΅Π²ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π½Π΅ Π±ΠΎΠ»ΡΡΠ΅ Π΄ΡΡΠ³ΠΈΡ
ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΏΠΎΠ΄ΠΌΠ°ΡΡΠΈΠ²Π°.
ΠΠΎΠ΄ΠΌΠ°ΡΡΠΈΠ² β ΡΡΠΎ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½Π°Ρ ΡΠ°ΡΡΡ ΠΌΠ°ΡΡΠΈΠ²Π°.
ΠΡΠΈΠΌΠ΅Ρ:
Input: nums = [1,4,2,5,3]
Output: 11
Explanation: There are 11 valid subarrays: [1],[4],[2],[5],[3],[1,4],[2,5],[1,4,2],[2,5,3],[1,4,2,5],[1,4,2,5,3].
π¨βπ» ΠΠ»Π³ΠΎΡΠΈΡΠΌ:
1β£Π½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠΉΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ans Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ 0. ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠΉΡΠ΅ ΠΏΡΡΡΠΎΠΉ ΡΡΠ΅ΠΊ st, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ Ρ
ΡΠ°Π½ΠΈΡΡ ΠΈΠ½Π΄Π΅ΠΊΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π² ΡΡΠ΅ΠΊΠ΅.
2β£ΠΡΠ΅ΡΠΈΡΡΠΉΡΠ΅ ΠΏΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌ ΠΌΠ°ΡΡΠΈΠ²Π° nums Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠ° i: ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΠΉΡΠ΅ ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΈΠ· ΡΡΠ΅ΠΊΠ° st, ΠΏΠΎΠΊΠ° ΡΡΠ΅ΠΊ Π½Π΅ ΡΡΠ°Π½Π΅Ρ ΠΏΡΡΡΡΠΌ ΠΈΠ»ΠΈ ΡΠ»Π΅ΠΌΠ΅Π½Ρ nums[i] Π½Π΅ ΡΡΠ°Π½Π΅Ρ Π±ΠΎΠ»ΡΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π½Π° Π²Π΅ΡΡΠΈΠ½Π΅ ΡΡΠ΅ΠΊΠ°. ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π΄ΠΎΠ±Π°Π²Π»ΡΠΉΡΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΠ΄ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ² ΠΊΠ°ΠΊ i - st.top(). ΠΠΎΠΌΠ΅ΡΡΠΈΡΠ΅ ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΈΠ½Π΄Π΅ΠΊΡ i Π² ΡΡΠ΅ΠΊ.
3β£ΠΠ·Π²Π»Π΅ΠΊΠΈΡΠ΅ Π²ΡΠ΅ ΠΎΡΡΠ°Π²ΡΠΈΠ΅ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΈΠ· ΡΡΠ΅ΠΊΠ° ΠΈ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΡΠ΅ ΡΠ°Π·ΠΌΠ΅Ρ nums ΠΊΠ°ΠΊ ΠΈΠ½Π΄Π΅ΠΊΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΠΌΠ΅Π½ΡΡΠ΅Π³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°. Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ, Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ nums.size() - st.top() ΠΊ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ans. ΠΠ΅ΡΠ½ΠΈΡΠ΅ ans.
π Π Π΅ΡΠ΅Π½ΠΈΠ΅:
class Solution {
public:
int validSubarrays(vector<int>& nums) {
int ans = 0;
stack<int> st;
for (int i = 0; i < nums.size(); i++) {
while (!st.empty() && nums[i] < nums[st.top()]) {
ans += (i - st.top());
st.pop();
}
st.push(i);
}
while (!st.empty()) {
ans += (nums.size() - st.top());
st.pop();
}
return ans;
}
};
Π‘ΡΠ°Π²Ρ π ΠΈ Π·Π°Π±ΠΈΡΠ°ΠΉ π ΠΠ°Π·Ρ Π·Π½Π°Π½ΠΈΠΉ