en
Feedback
C/C++ | LeetCode

C/C++ | LeetCode

Open in Telegram

Π‘Π°ΠΉΡ‚: https://easyoffer.ru/ ВсС ΠΊΠ°Π½Π°Π»Ρ‹: t.me/+xGeAw6ckJ4liYzQy ΠšΠΎΠ½Ρ‚Π°ΠΊΡ‚ для Ρ€Π΅ΠΊΠ»Π°ΠΌΡ‹: @easyoffer_adv

Show more
3 238
Subscribers
+424 hours
+127 days
+230 days
Posts Archive
Π—Π°Π΄Π°Ρ‡Π°: 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;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 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;
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 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());
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 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);
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

⚑️ Π’ сСти Π½Π°Ρ‡Π°Π»ΠΈ массово ΡΠ»ΠΈΠ²Π°Ρ‚ΡŒ курсы ΠΈ ΠΊΠ½ΠΈΠ³ΠΈ извСстных ΠΎΠ½Π»Π°ΠΉΠ½ школ ΠΏΠΎ Π°ΠΉΡ‚ΠΈ Π’ΠΎΡ‚ отсортированная Π±Π°Π·Π° с Ρ‚ΠΎΠ½Π½ΠΎΠΉ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° (пос
⚑️ Π’ сСти Π½Π°Ρ‡Π°Π»ΠΈ массово ΡΠ»ΠΈΠ²Π°Ρ‚ΡŒ курсы ΠΈ ΠΊΠ½ΠΈΠ³ΠΈ извСстных ΠΎΠ½Π»Π°ΠΉΠ½ школ ΠΏΠΎ Π°ΠΉΡ‚ΠΈ Π’ΠΎΡ‚ отсортированная Π±Π°Π·Π° с Ρ‚ΠΎΠ½Π½ΠΎΠΉ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π° (постСпСнно пополняСтся): (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

Π—Π°Π΄Π°Ρ‡Π°: 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;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 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;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 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;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 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;
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 285. Inorder Successor in BST Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ ΠΊΠΎΡ€Π΅Π½ΡŒ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π° поиска ΠΈ ΡƒΠ·Π΅Π» p Π² Π½Π΅ΠΌ. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ ΠΏΡ€Π΅Π΅ΠΌΠ½ΠΈΠΊΠ°
Π—Π°Π΄Π°Ρ‡Π°: 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);
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 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];
            }
        });
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 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];
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Repost from easyoffer
Π‘Π°Π·Π° 1000+ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… собСсСдований Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ встроСна Π² easyoffer Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅, ΠΊΠ°ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚Ρ‹ ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‚ Π½Π° вопросы, Ρ€Π΅ΡˆΠ°ΡŽΡ‚ Π·Π°Π΄Π°
Π‘Π°Π·Π° 1000+ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… собСсСдований Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ встроСна Π² easyoffer Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅, ΠΊΠ°ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚Ρ‹ ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‚ Π½Π° вопросы, Ρ€Π΅ΡˆΠ°ΡŽΡ‚ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ проходят этапы Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… собСсСдованиях ΠΎΡ‚ Ρ‚ΠΎΠΏΠΎΠ²Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΉ. ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΡŒΡ‚Π΅ΡΡŒ ΠΊ своСму собСсСдованию с Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ. НапоминаСм, Ρ‡Ρ‚ΠΎ сСгодня послСдний дСнь Π§Ρ‘Ρ€Π½ΠΎΠΉ ΠŸΡΡ‚Π½ΠΈΡ†Ρ‹ πŸ‘‰ Π—Π°Π±Ρ€Π°Ρ‚ΡŒ PRO со скидкой 70%: https://easyoffer.ru/

Π—Π°Π΄Π°Ρ‡Π°: 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;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 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);
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 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};
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 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;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Repost from easyoffer
ЧСрная пятница Π½Π° easyoffer Π‘ΠΊΠΈΠ΄ΠΊΠ° 70% Π½Π° PRO Π΄ΠΎ 29 ноября. πŸ‘‰ https://easyoffer.ru/
ЧСрная пятница Π½Π° easyoffer Π‘ΠΊΠΈΠ΄ΠΊΠ° 70% Π½Π° PRO Π΄ΠΎ 29 ноября. πŸ‘‰ https://easyoffer.ru/

Π—Π°Π΄Π°Ρ‡Π°: 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;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 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;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ