en
Feedback
C/C++ | LeetCode

C/C++ | LeetCode

Open in Telegram

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

Show more
3 236
Subscribers
+424 hours
+127 days
+230 days
Posts Archive
Π—Π°Π΄Π°Ρ‡Π°: 1329. Sort the Matrix Diagonally Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”ΠΈΠ°Π³ΠΎΠ½Π°Π»ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ β€” это диагональная линия ячССк, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰Π°ΡΡΡ с ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ячСйки Π² самой Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ строкС ΠΈΠ»ΠΈ Π² самом Π»Π΅Π²ΠΎΠΌ столбцС ΠΈ идущая Π² Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ Π²Π½ΠΈΠ·-Π²ΠΏΡ€Π°Π²ΠΎ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹. НапримСр, диагональ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰Π°ΡΡΡ с mat[2][0], Π³Π΄Π΅ mat β€” это ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 6 x 3, Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ячСйки mat[2][0], mat[3][1] ΠΈ mat[4][2]. Π”Π°Π½Π° ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° mat Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ m x n, состоящая ΠΈΠ· Ρ†Π΅Π»Ρ‹Ρ… чисСл. ΠžΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ диагональ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΏΠΎ Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°Π½ΠΈΡŽ ΠΈ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: mat = [[3,3,1,1],[2,2,1,2],[1,1,1,2]]
Output: [[1,1,1,1],[1,2,2,2],[1,2,3,3]]
πŸ‘¨β€πŸ’» Алгоритм: 1⃣БохранитС Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ m ΠΈ n. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ…Π΅Ρˆ-ΠΊΠ°Ρ€Ρ‚Ρƒ ΠΈΠ· ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΡƒΡ‡ для хранСния элСмСнтов Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»Π΅ΠΉ. 2βƒ£Π’ΡΡ‚Π°Π²ΡŒΡ‚Π΅ значСния Π² Ρ…Π΅Ρˆ-ΠΊΠ°Ρ€Ρ‚Ρƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ€Π°Π·Π½ΠΎΡΡ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ индСксами строки ΠΈ столбца ΠΊΠ°ΠΊ ΠΊΠ»ΡŽΡ‡, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ элСмСнты Π½Π° ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ. 3βƒ£Π˜Π·Π²Π»Π΅ΠΊΠΈΡ‚Π΅ значСния ΠΈΠ· Ρ…Π΅Ρˆ-ΠΊΠ°Ρ€Ρ‚Ρ‹ ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ, заполняя Π΅Π΅ отсортированными значСниями Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»Π΅ΠΉ. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ. 😎 РСшСниС:
class Solution {
public:
    vector<vector<int>> diagonalSort(vector<vector<int>>& mat) {
        size_t m = mat.size();
        size_t n = mat[0].size();

        map<int, priority_queue<int, vector<int>, greater<int>>> diagonals;

        for (size_t row = 0; row < m; row++) {
            for (size_t col = 0; col < n; col++) {
                diagonals[row - col].push(mat[row][col]);
            }
        }

        for (size_t row = 0; row < m; row++) {
            for (size_t col = 0; col < n; col++) {
                mat[row][col] = diagonals[row - col].top();
                diagonals[row - col].pop();
            }
        }

        return mat;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 935. Knight Dialer Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π¨Π°Ρ…ΠΌΠ°Ρ‚Π½Ρ‹ΠΉ конь ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ΠΌ: ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ Π½Π° Π΄Π²Π΅ ΠΊΠ»Π΅Ρ‚ΠΊΠΈ ΠΏΠΎ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ ΠΈ ΠΎΠ΄Π½Ρƒ ΠΊΠ»Π΅Ρ‚ΠΊΡƒ ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ, ΠΈΠ»ΠΈ Π½Π° Π΄Π²Π΅ ΠΊΠ»Π΅Ρ‚ΠΊΠΈ ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ ΠΈ ΠΎΠ΄Π½Ρƒ ΠΊΠ»Π΅Ρ‚ΠΊΡƒ ΠΏΠΎ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ (ΠΏΡ€ΠΈ этом ΠΎΠ±Π΅ ΠΊΠ»Π΅Ρ‚ΠΊΠΈ ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ Ρ„ΠΎΡ€ΠΌΡƒ Π±ΡƒΠΊΠ²Ρ‹ L). Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ двиТСния ΡˆΠ°Ρ…ΠΌΠ°Ρ‚Π½ΠΎΠ³ΠΎ коня ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Π½Π° этой Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ΅: Π¨Π°Ρ…ΠΌΠ°Ρ‚Π½Ρ‹ΠΉ конь ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΡˆΠ°Ρ…ΠΌΠ°Ρ‚Π½ΠΎΠΉ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ΅ Π½ΠΈΠΆΠ΅: Π£ нас Π΅ΡΡ‚ΡŒ ΡˆΠ°Ρ…ΠΌΠ°Ρ‚Π½Ρ‹ΠΉ конь ΠΈ тСлСфонная панСль, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅, конь ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚ΠΎΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° числовой ΠΊΠ»Π΅Ρ‚ΠΊΠ΅ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π½Π° синСй ΠΊΠ»Π΅Ρ‚ΠΊΠ΅). Учитывая Ρ†Π΅Π»ΠΎΠ΅ число n, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅, сколько Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π½Ρ‹Ρ… Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² Π΄Π»ΠΈΠ½Ρ‹ n ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°Π±Ρ€Π°Ρ‚ΡŒ. Π’Π°ΠΌ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ сначала ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ коня Π½Π° Π»ΡŽΠ±ΡƒΡŽ Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΡƒΡŽ ΠΊΠ»Π΅Ρ‚ΠΊΡƒ, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ n - 1 ΠΏΡ€Ρ‹ΠΆΠΊΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°Π±Ρ€Π°Ρ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€ Π΄Π»ΠΈΠ½Ρ‹ n. ВсС ΠΏΡ€Ρ‹ΠΆΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΡ€Ρ‹ΠΆΠΊΠ°ΠΌΠΈ коня. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΡ‚Π²Π΅Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ большим, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ ΠΎΡ‚Π²Π΅Ρ‚ ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ 10^9 + 7. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: n = 1
Output: 10
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ двиТСния коня с ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠΉ ΠΊΠ»Π΅Ρ‚ΠΊΠΈ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ динамичСскоС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для хранСния количСства способов достиТСния ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠΉ ΠΊΠ»Π΅Ρ‚ΠΊΠΈ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС. 2βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ массив DP количСством способов Π½Π°Π±ΠΎΡ€Π° Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π½ΠΎΠ³ΠΎ Π½ΠΎΠΌΠ΅Ρ€Π° Π΄Π»ΠΈΠ½Ρ‹ 1 для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠΉ ΠΊΠ»Π΅Ρ‚ΠΊΠΈ (это просто 1). На ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ массив DP, пСрСходя ΠΏΠΎ всСм Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ двиТСниям коня. 3βƒ£Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒ сумму всСх Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² массивС DP Π½Π° послСднСм шагС. 😎 РСшСниС:
class Solution {
public:
    int knightDialer(int n) {
        int MOD = 1000000007;
        vector<vector<int>> moves = {
            {4, 6},
            {6, 8},
            {7, 9},
            {4, 8},
            {0, 3, 9},
            {},
            {0, 1, 7},
            {2, 6},
            {1, 3},
            {2, 4}
        };
        
        vector<int> dp(10, 1);
        
        for (int step = 1; step < n; step++) {
            vector<int> newDp(10, 0);
            for (int i = 0; i < 10; i++) {
                for (int move : moves[i]) {
                    newDp[move] = (newDp[move] + dp[i]) % MOD;
                }
            }
            dp = newDp;
        }
        
        return accumulate(dp.begin(), dp.end(), 0, [&](int sum, int count) {
            return (sum + count) % MOD;
        });
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 508. Most Frequent Subtree Sum Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ΠΎ ΠΊΠΎΡ€Π΅Π½ΡŒ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π°, Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ часто Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‰ΡƒΡŽΡΡ с
Π—Π°Π΄Π°Ρ‡Π°: 508. Most Frequent Subtree Sum Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ΠΎ ΠΊΠΎΡ€Π΅Π½ΡŒ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π°, Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ часто Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‰ΡƒΡŽΡΡ сумму ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Π°. Если Π΅ΡΡ‚ΡŒ нСсколько Ρ‚Π°ΠΊΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ всС значСния с наибольшСй частотой Π² любом порядкС. Π‘ΡƒΠΌΠΌΠ° ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Π° ΡƒΠ·Π»Π° опрСдСляСтся ΠΊΠ°ΠΊ сумма всСх Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΡƒΠ·Π»ΠΎΠ², ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎΠΌ, ΡƒΠΊΠΎΡ€Π΅Π½Π΅Π½Π½Ρ‹ΠΌ Π² этом ΡƒΠ·Π»Π΅ (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ сам ΡƒΠ·Π΅Π»). ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: root = [5,2,-3]
Output: [2,-3,4]
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ sumFreq для хранСния частоты всСх сумм ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π². Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ maxFreq для хранСния максимальной частоты. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ массив maxFreqSums для хранСния всСх сумм ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π², частота ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π°Π²Π½Π° максимальной. 2βƒ£ΠžΠ±Ρ…ΠΎΠ΄ Π΄Π΅Ρ€Π΅Π²Π° ΠΈ вычислСниС сумм Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΎΠ±Ρ…ΠΎΠ΄ Π΄Π΅Ρ€Π΅Π²Π° Π² порядкС post-order. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ суммы ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π² Π»Π΅Π²ΠΎΠ³ΠΎ ΠΈ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… ΡƒΠ·Π»ΠΎΠ² для вычислСния суммы Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Π°. Π£Π²Π΅Π»ΠΈΡ‡ΡŒΡ‚Π΅ частоту Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ суммы Π² sumFreq. ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ maxFreq, Ссли частота Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ суммы большС Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ maxFreq. 3⃣Бборка Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠŸΡ€ΠΎΠΉΠ΄ΠΈΡ‚Π΅ΡΡŒ ΠΏΠΎ sumFreq ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ всС суммы с частотой, Ρ€Π°Π²Π½ΠΎΠΉ maxFreq, Π² массив maxFreqSums. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ массив maxFreqSums. 😎 РСшСниС:
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <queue>

using namespace std;

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

class Solution {
public:
    vector<int> findFrequentTreeSum(TreeNode* root) {
        unordered_map<int, int> sumFreq;
        int maxFreq = 0;
        
        function<int(TreeNode*)> subtreeSum = [&](TreeNode* node) {
            if (!node) return 0;
            int leftSum = subtreeSum(node->left);
            int rightSum = subtreeSum(node->right);
            int currSum = node->val + leftSum + rightSum;
            sumFreq[currSum]++;
            maxFreq = max(maxFreq, sumFreq[currSum]);
            return currSum;
        };
        
        subtreeSum(root);
        vector<int> result;
        for (const auto& [sum, freq] : sumFreq) {
            if (freq == maxFreq) {
                result.push_back(sum);
            }
        }
        return result;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 727. Minimum Window Subsequence Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: hard Если Π² строках s1 ΠΈ s2 Π½Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΠΎΠΊΡ€Ρ‹Π²Π°Π»ΠΎ Π±Ρ‹ всС символы Π² s2, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ ΠΏΡƒΡΡ‚ΡƒΡŽ строку "". Если Ρ‚Π°ΠΊΠΈΡ… ΠΎΠΊΠΎΠ½ минимальной Π΄Π»ΠΈΠ½Ρ‹ нСсколько, возвращаСтся ΠΎΠΊΠ½ΠΎ с самым Π»Π΅Π²Ρ‹ΠΌ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌ индСксом. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: s1 = "abcdebdde", s2 = "bde"
Output: "bcde"
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π΄Π²Π° указатСля для опрСдСлСния Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΎΠΊΠ½Π°. 2βƒ£ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΠΉΡ‚Π΅ счСтчики для символов Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΎΠΊΠ½Π΅ ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Ρ… символов ΠΈΠ· s2. 3βƒ£ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΠΉΡ‚Π΅ ΠΏΡ€Π°Π²Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ подходящСС ΠΎΠΊΠ½ΠΎ, ΠΈ Π»Π΅Π²Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ. 😎 РСшСниС:
class Solution {
public:
    string minWindow(string s1, string s2) {
        if (s1.empty() || s2.empty()) {
            return "";
        }

        unordered_map<char, int> dictT;
        for (char c : s2) {
            dictT[c]++;
        }

        int required = dictT.size();
        int l = 0, r = 0, formed = 0;
        unordered_map<char, int> windowCounts;
        int ans[3] = {INT_MAX, 0, 0};

        while (r < s1.size()) {
            char c = s1[r];
            windowCounts[c]++;

            if (dictT.count(c) && windowCounts[c] == dictT[c]) {
                formed++;
            }

            while (l <= r && formed == required) {
                c = s1[l];

                if (r - l + 1 < ans[0]) {
                    ans[0] = r - l + 1;
                    ans[1] = l;
                    ans[2] = r;
                }

                windowCounts[c]--;
                if (dictT.count(c) && windowCounts[c] < dictT[c]) {
                    formed--;
                }

                l++;
            }

            r++;
        }

        return ans[0] == INT_MAX ? "" : s1.substr(ans[1], ans[0]);
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 1125. Smallest Sufficient Team Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: hard Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Ρƒ вас Π΅ΡΡ‚ΡŒ список Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π½Π°Π²Ρ‹ΠΊΠΎΠ² req_skills ΠΈ список людСй. i-ΠΉ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ people[i] содСрТит список Π½Π°Π²Ρ‹ΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ этот Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ. Рассмотрим Π΄ΠΎΡΡ‚Π°Ρ‚ΠΎΡ‡Π½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ: Π½Π°Π±ΠΎΡ€ людСй, Ρ‚Π°ΠΊΠΎΠΉ Ρ‡Ρ‚ΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ Π½Π°Π²Ρ‹ΠΊΠ° ΠΈΠ· req_skills, Π΅ΡΡ‚ΡŒ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ ΠΎΠ΄ΠΈΠ½ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ этим Π½Π°Π²Ρ‹ΠΊΠΎΠΌ. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ эти ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ индСксами ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°. НапримСр, ΠΊΠΎΠΌΠ°Π½Π΄Π° = [0, 1, 3] прСдставляСт людСй с Π½Π°Π²Ρ‹ΠΊΠ°ΠΌΠΈ people[0], people[1] ΠΈ people[3]. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ Π»ΡŽΠ±ΡƒΡŽ Π΄ΠΎΡΡ‚Π°Ρ‚ΠΎΡ‡Π½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ наимСньшСго Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½Π½ΡƒΡŽ индСксами ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚ Π² любом порядкС. ГарантируСтся, Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π²Π΅Ρ‚ сущСствуСт. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: req_skills = ["algorithms","math","java","reactjs","csharp","aws"],
people = [["algorithms","math","java"],["algorithms","math","reactjs"],
["java","csharp","aws"],["reactjs","csharp"],["csharp","math"],["aws","java"]]
Output: [1,2]
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΈ созданиС масок Π½Π°Π²Ρ‹ΠΊΠΎΠ²: ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ количСство людСй n ΠΈ количСство Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… Π½Π°Π²Ρ‹ΠΊΠΎΠ² m. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ…ΡΡˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ skillId, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Π½Π°Π²Ρ‹ΠΊΡƒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ индСкс. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ массив skillsMaskOfPerson, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ маски Π½Π°Π²Ρ‹ΠΊΠΎΠ² для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°. 2⃣ДинамичСскоС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ (DP): Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ массив dp Ρ€Π°Π·ΠΌΠ΅Ρ€Π° 2^m ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ Π΅Π³ΠΎ значСниями (1 << n) - 1. УстановитС dp[0] Π² 0 (Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ случай). Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ skillsMask ΠΎΡ‚ 1 Π΄ΠΎ 2^m - 1: - для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ° i: - вычислитС smallerSkillsMask ΠΊΠ°ΠΊ skillsMask & ~skillsMaskOfPerson[i]. - Ссли smallerSkillsMask отличаСтся ΠΎΡ‚ skillsMask, ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ dp[skillsMask], Ссли новая ΠΊΠΎΠΌΠ°Π½Π΄Π° Π»ΡƒΡ‡ΡˆΠ΅ (ΠΈΠΌΠ΅Π΅Ρ‚ мСньшС установлСнных Π±ΠΈΡ‚ΠΎΠ²). 3⃣ЀормированиС ΠΎΡ‚Π²Π΅Ρ‚Π°: Π˜Π·Π²Π»Π΅ΠΊΠΈΡ‚Π΅ ΠΎΡ‚Π²Π΅Ρ‚ ΠΈΠ· dp ΠΈ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ массив индСксов людСй, ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Π΄ΠΎΡΡ‚Π°Ρ‚ΠΎΡ‡Π½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ. 😎 РСшСниС:
class Solution {
public:
    vector<int> smallestSufficientTeam(vector<string>& req_skills, vector<vector<string>>& people) {
        int n = people.size(), m = req_skills.size();
        unordered_map<string, int> skillId;
        for (int i = 0; i < m; i++) {
            skillId[req_skills[i]] = i;
        }
        vector<int> skillsMaskOfPerson(n, 0);
        for (int i = 0; i < n; i++) {
            for (const string& skill : people[i]) {
                skillsMaskOfPerson[i] |= 1 << skillId[skill];
            }
        }
        vector<long> dp(1 << m, (1L << n) - 1);
        dp[0] = 0;
        for (int skillsMask = 1; skillsMask < (1 << m); skillsMask++) {
            for (int i = 0; i < n; i++) {
                int smallerSkillsMask = skillsMask & ~skillsMaskOfPerson[i];
                if (smallerSkillsMask != skillsMask) {
                    long peopleMask = dp[smallerSkillsMask] | (1L << i);
                    if (__builtin_popcountll(peopleMask) < __builtin_popcountll(dp[skillsMask])) {
                        dp[skillsMask] = peopleMask;
                    }
                }
            }
        }
        long answerMask = dp[(1 << m) - 1];
        vector<int> ans;
        for (int i = 0; i < n; i++) {
            if ((answerMask >> i) & 1) {
                ans.push_back(i);
            }
        }
        return ans;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

"Π’Ρ‹ Ρ‡Π΅, Π΄ΡƒΡ€Π°ΠΊ?" – базовая рСакция ΡΠ΅Π½ΡŒΠΎΡ€Π° Π½Π° Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ ΠΏΠΎΠΊΡƒΠΏΠ°Π΅Ρ‚ IT курсы Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π»Π°ΠΉΠ½ ΡˆΠΊΠΎΠ»Ρ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ ΠΈΠ½ΠΊΡƒΠ±Π°Ρ‚ΠΎΡ€Π½Ρ‹Ρ… Π°ΠΉΡ‚
"Π’Ρ‹ Ρ‡Π΅, Π΄ΡƒΡ€Π°ΠΊ?" – базовая рСакция ΡΠ΅Π½ΡŒΠΎΡ€Π° Π½Π° Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ ΠΏΠΎΠΊΡƒΠΏΠ°Π΅Ρ‚ IT курсы Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π»Π°ΠΉΠ½ ΡˆΠΊΠΎΠ»Ρ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ ΠΈΠ½ΠΊΡƒΠ±Π°Ρ‚ΠΎΡ€Π½Ρ‹Ρ… Π°ΠΉΡ‚ΠΈΡˆΠ½ΠΈΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… условиях попросту зависнут. Π’Ρ€ΡƒΡˆΠ½Ρ‹Π΅ рСбята учатся Π½Π° ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»Π°Ρ… для Π°ΠΉΡ‚ΠΈΡˆΠ½ΠΈΠΊΠΎΠ². Π’ΠΎΡ‚ Ρ‚ΠΎΠΏ-5 ΠΎΡ‚ Ρ‚ΠΈΠΌΠ»ΠΈΠ΄Π° ΠΈΠ· Π‘Π±Π΅Ρ€Π°: βš™οΈ ВСхнолодТия – для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π² курсС новостСй Π² Π°ΠΉΡ‚ΠΈ 🧠 Ai-Ρ‡Π½ΠΈΡ†Π° – способы ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ нСйросСти Π² Π·Π°Ρ€Π°Π±ΠΎΡ‚ΠΎΠΊ $$$ πŸ’» ИИ тСбя Π·Π°ΠΌΠ΅Π½ΠΈΡ‚! – Ρ‚Π΅Π½Π΄Π΅Π½Ρ†ΠΈΠΈ Π°ΠΉΡ‚ΠΈ Ρ€Ρ‹Π½ΠΊΠ° Π² связкС с нСйросСтями 4️⃣ Π’ΠΎΠΉΡ‚ΠΈ Π² IT – Ρ‚ΠΎΠ½Π½Ρ‹ бСсплатного обучСния для ΠΏΡ€ΠΎΠ³Π΅Ρ€ΠΎΠ² πŸ˜„ IT индус – сборник Π°ΠΉΡ‚ΠΈ ΠΌΠ΅ΠΌΠΎΠ²

Π—Π°Π΄Π°Ρ‡Π°: 726. Number of Atoms Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: hard Если Π·Π°Π΄Π°Π½Π° строковая Ρ„ΠΎΡ€ΠΌΡƒΠ»Π°, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ Ρ…ΠΈΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρƒ, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ количСство Π°Ρ‚ΠΎΠΌΠΎΠ². Атомный элСмСнт всСгда начинаСтся с прописного символа, Π·Π°Ρ‚Π΅ΠΌ ноль ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ строчных Π±ΡƒΠΊΠ², ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… Π΅Π³ΠΎ Π½Π°Π·Π²Π°Π½ΠΈΠ΅. Если количСство большС 1, Π·Π° Π½ΠΈΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Π° ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ†ΠΈΡ„Ρ€, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… количСство элСмСнтов. НапримСр, "H2O" ΠΈ "H2O2" Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹, Π° "H1O2" Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½. Π”Π²Π΅ Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρ‹ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ вмСстС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρƒ. НапримСр, "H2O2He3Mg4" Ρ‚Π°ΠΊΠΆΠ΅ являСтся Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΎΠΉ. Π€ΠΎΡ€ΠΌΡƒΠ»Π°, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Π°Ρ Π² ΠΊΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки, ΠΈ счСт (ΠΏΠΎ ТСланию) Ρ‚Π°ΠΊΠΆΠ΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ„ΠΎΡ€ΠΌΡƒΠ»Π°ΠΌΠΈ. НапримСр, "(H2O2)" ΠΈ "(H2O2)3" ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ„ΠΎΡ€ΠΌΡƒΠ»Π°ΠΌΠΈ. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ количСство всСх элСмСнтов Π² Π²ΠΈΠ΄Π΅ строки Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Π²ΠΈΠ΄Π΅: ΠΏΠ΅Ρ€Π²ΠΎΠ΅ имя (Π² отсортированном порядкС), Π·Π°Ρ‚Π΅ΠΌ Π΅Π³ΠΎ количСство (Ссли это количСство большС 1), Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‚ΠΎΡ€ΠΎΠ΅ имя (Π² отсортированном порядкС), Π·Π°Ρ‚Π΅ΠΌ Π΅Π³ΠΎ количСство (Ссли это количСство большС 1) ΠΈ Ρ‚. Π΄. ВСстовыС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС значСния Π² Π²Ρ‹Π²ΠΎΠ΄Π΅ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π»ΠΈΡΡŒ Π² 32-Π±ΠΈΡ‚Π½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ число. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: formula = "H2O"
Output: "H2O"
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ стСк для отслСТивания Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ уровня скобок. 2βƒ£ΠŸΡ€ΠΎΠΉΠ΄ΠΈΡ‚Π΅ ΠΏΠΎ строкС Ρ„ΠΎΡ€ΠΌΡƒΠ»Ρ‹, анализируя ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ символ: Если символ - это ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π°Ρ скобка '(', создайтС Π½ΠΎΠ²Ρ‹ΠΉ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ для хранСния Π°Ρ‚ΠΎΠΌΠΎΠ² Π²Π½ΡƒΡ‚Ρ€ΠΈ скобок. Если символ - это Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π°Ρ скобка ')', ΠΈΠ·Π²Π»Π΅ΠΊΠΈΡ‚Π΅ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ ΠΈΠ· стСка ΠΈ ΡƒΠΌΠ½ΠΎΠΆΡŒΡ‚Π΅ количСства Π°Ρ‚ΠΎΠΌΠΎΠ² Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ число, Ссли ΠΎΠ½ΠΎ присутствуСт. Если символ - это Π°Ρ‚ΠΎΠΌ (начинаСтся с Π·Π°Π³Π»Π°Π²Π½ΠΎΠΉ Π±ΡƒΠΊΠ²Ρ‹), ΠΈΠ·Π²Π»Π΅ΠΊΠΈΡ‚Π΅ имя Π°Ρ‚ΠΎΠΌΠ° ΠΈ Π΅Π³ΠΎ количСство, ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π΅Π³ΠΎ Π² Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ. 3βƒ£ΠŸΠΎΡΠ»Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ строки, ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚Π΅ всС словари ΠΈΠ· стСка ΠΈ отсортируйтС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. 😎 РСшСниС:
class Solution {
public:
    string countOfAtoms(string formula) {
        stack<map<string, int>> stack;
        stack.push(map<string, int>());
        int n = formula.size();
        int i = 0;

        while (i < n) {
            if (formula[i] == '(') {
                stack.push(map<string, int>());
                i++;
            } else if (formula[i] == ')') {
                map<string, int> top = stack.top();
                stack.pop();
                i++;
                int start = i;
                while (i < n && isdigit(formula[i])) {
                    i++;
                }
                int multiplicity = i > start ? stoi(formula.substr(start, i - start)) : 1;
                for (const auto& [name, count] : top) {
                    stack.top()[name] += count * multiplicity;
                }
            } else {
                int start = i;
                i++;
                while (i < n && islower(formula[i])) {
                    i++;
                }
                string name = formula.substr(start, i - start);
                start = i;
                while (i < n && isdigit(formula[i])) {
                    i++;
                }
                int multiplicity = i > start ? stoi(formula.substr(start, i - start)) : 1;
                stack.top()[name] += multiplicity;
            }
        }

        map<string, int> countMap = stack.top();
        string result;
        for (const auto& [name, count] : countMap) {
            result += name;
            if (count > 1) {
                result += to_string(count);
            }
        }
        return result;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

ΠΠΉΡ‚ΠΈΡˆΠ½ΠΈΠΊΠΈ, это Π²Π°ΠΌ β€” Π² Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ Π΅ΡΡ‚ΡŒ ΠΊΠΎΠΌΡŒΡŽΠ½ΠΈΡ‚ΠΈ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ Π² IT Π’Π°ΠΌ Π΅ΡΡ‚ΡŒ Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ всё: Ρ‡Π°Ρ‚Ρ‹ для общСния, Ρ‚ΠΎΠ½Π½Ρ‹ ΠΌΠ°
ΠΠΉΡ‚ΠΈΡˆΠ½ΠΈΠΊΠΈ, это Π²Π°ΠΌ β€” Π² Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ Π΅ΡΡ‚ΡŒ ΠΊΠΎΠΌΡŒΡŽΠ½ΠΈΡ‚ΠΈ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ Π² IT Π’Π°ΠΌ Π΅ΡΡ‚ΡŒ Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ всё: Ρ‡Π°Ρ‚Ρ‹ для общСния, Ρ‚ΠΎΠ½Π½Ρ‹ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π°(ΠΊΠ½ΠΈΠ³ΠΈ, курсы, рСсурсы ΠΈ Π³Π°ΠΉΠ΄Ρ‹), свСТиС новости ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅ ΠΌΠ΅ΠΌΡ‹ Π’Ρ‹Π±ΠΈΡ€Π°ΠΉΡ‚Π΅ своё Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅: πŸ’© Frontend 🐍 Python 🐧 Linux πŸ‘©β€πŸ’» Π‘/Π‘++ πŸ‘©β€πŸ’» C# πŸ€” Π₯Π°ΠΊΠΈΠ½Π³ & Π˜Π‘ πŸ“± GitHub πŸ–₯ SQL πŸ‘©β€πŸ’» Бисадмин 🀟 DevOps βš™οΈ Backend πŸ–₯ Data Science πŸ§‘β€πŸ’» Java 🐞 ВСстированиС πŸ–₯ PM / PdM πŸ‘©β€πŸ’» GameDev πŸ§‘β€πŸ’» Golang πŸ€΅β€β™‚οΈ IT-ΠœΠΈΡ‚Π°ΠΏΡ‹ πŸ§‘β€πŸ’» PHP πŸ’» WebDev πŸ–₯ Моб. Dev πŸ–₯Анали.(SA&BA) πŸ‘©β€πŸ’» Π”ΠΈΠ·Π°ΠΉΠ½ πŸ–₯ НСйросСти πŸ’› 1C πŸ€“ Книги IT ➑️ БохраняйтС Π² Π·Π°ΠΊΠ»Π°Π΄ΠΊΠΈ

Π—Π°Π΄Π°Ρ‡Π°: 116. Populating Next Right Pointers in Each Node Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ΠΎ идСальноС Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ. НуТно ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ n
Π—Π°Π΄Π°Ρ‡Π°: 116. Populating Next Right Pointers in Each Node Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ΠΎ идСальноС Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ. НуТно ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ next-ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΠ·Π΅Π» ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π» Π½Π° своСго сосСда справа. Если сосСда Π½Π΅Ρ‚ β€” ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ nullptr. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: root = [1,2,3,4,5,6,7] Output: [1,#,2,3,#,4,5,6,7,#]
Π‘ΠΈΠΌΠ²ΠΎΠ» # ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΊΠΎΠ½Π΅Ρ† уровня.
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ (queue<Node*>) для ΠΎΠ±Ρ…ΠΎΠ΄Π° Π΄Π΅Ρ€Π΅Π²Π° Π² ΡˆΠΈΡ€ΠΈΠ½Ρƒ (BFS). НачинаСм с корня. 2⃣На ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ while, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ size β€” количСство ΡƒΠ·Π»ΠΎΠ² Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ уровня. Для всСх ΡƒΠ·Π»ΠΎΠ² этого уровня: ИзвлСкаСм ΡƒΠ·Π΅Π» ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. Если это Π½Π΅ послСдний ΡƒΠ·Π΅Π» уровня, устанавливаСм node->next = Q.front(). ДобавляСм Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π»Π΅Π²ΠΎΠ³ΠΎ ΠΈ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ². 3βƒ£ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΡΠ΅ΠΌ, ΠΏΠΎΠΊΠ° ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π½Π΅ пуста. 😎 РСшСниС:
class Solution {
public:
    Node* connect(Node* root) {
        if (root == nullptr) {
            return root;
        }

        queue<Node*> Q;
        Q.push(root);

        while (!Q.empty()) {
            int size = Q.size();

            for (int i = 0; i < size; i++) {
                Node* node = Q.front();
                Q.pop();

                if (i < size - 1) {
                    node->next = Q.front();
                }

                if (node->left != nullptr) {
                    Q.push(node->left);
                }

                if (node->right != nullptr) {
                    Q.push(node->right);
                }
            }
        }

        return root;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 754. Reach a Number Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π’Ρ‹ стоитС Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 0 Π½Π° бСсконСчной числовой прямой. Π’ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ target находится ΠΏΡƒΠ½ΠΊΡ‚ назначСния. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ количСство Ρ…ΠΎΠ΄ΠΎΠ² numMoves Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹: Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ…ΠΎΠ΄Ρƒ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ ΠΏΠΎΠΉΡ‚ΠΈ Π»ΠΈΠ±ΠΎ Π½Π°Π»Π΅Π²ΠΎ, Π»ΠΈΠ±ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΎ. Π’ΠΎ врСмя i-Π³ΠΎ Ρ…ΠΎΠ΄Π° (начиная с i == 1 Π΄ΠΎ i == numMoves) Π²Ρ‹ Π΄Π΅Π»Π°Π΅Ρ‚Π΅ i шагов Π² Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ. Учитывая Ρ†Π΅Π»ΠΎΠ΅ число target, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ минимальноС количСство Ρ…ΠΎΠ΄ΠΎΠ² (Ρ‚.Π΅. минимальноС numMoves), Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ для достиТСния ΠΏΡƒΠ½ΠΊΡ‚Π° назначСния. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: target = 2
Output: 3
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ для Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ (position) ΠΈ счСтчик шагов (steps). 2βƒ£Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ†ΠΈΠΊΠ», Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΊ position Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ количСство шагов ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ steps. 3⃣Если position достигаСт ΠΈΠ»ΠΈ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ target ΠΈ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ position ΠΈ target чСтная, остановитС Ρ†ΠΈΠΊΠ» ΠΈ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ steps. 😎 РСшСниС:
class Solution {
public:
    int reachTarget(int target) {
        target = abs(target);
        int position = 0;
        int steps = 0;
        while (position < target || (position - target) % 2 != 0) {
            steps++;
            position += steps;
        }
        return steps;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 350. Intersection of Two Arrays II Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: easy Π”Π°Π½Ρ‹ Π΄Π²Π° цСлочислСнных массива nums1 ΠΈ nums2. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ массив ΠΈΡ… пСрСсСчСния. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΡΠ²Π»ΡΡ‚ΡŒΡΡ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·, сколько ΠΎΠ½ встрСчаСтся Π² ΠΎΠ±ΠΎΠΈΡ… массивах. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² любом порядкС. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: nums1 = [1,2,2,1], nums2 = [2,2]
Output: [2,2]
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£ΠŸΠΎΠ΄ΡΡ‡Π΅Ρ‚ частоты элСмСнтов: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΈΠ»ΠΈ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ для подсчСта количСства Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Π² nums1. 2⃣НахоТдСниС пСрСсСчСния: ΠŸΡ€ΠΎΠΉΠ΄ΠΈΡ‚Π΅ ΠΏΠΎ элСмСнтам nums2, ΠΈ Ссли элСмСнт присутствуСт Π² Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΈΠ· шага 1 ΠΈ Π΅Π³ΠΎ счСтчик большС нуля, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ этот элСмСнт Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚Π΅ счСтчик. 3⃣Возврат Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°: Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ массив пСрСсСчСния. 😎 РСшСниС:
class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        unordered_map<int, int> counts;
        vector<int> result;
        
        for (int num : nums1) {
            counts[num]++;
        }
        
        for (int num : nums2) {
            if (counts[num] > 0) {
                result.push_back(num);
                counts[num]--;
            }
        }
        
        return result;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 1481. Least Number of Unique Integers after K Removals Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ массив Ρ†Π΅Π»Ρ‹Ρ… чисСл arr ΠΈ Ρ†Π΅Π»ΠΎΠ΅ число k. НайдитС минимальноС количСство ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… Ρ†Π΅Π»Ρ‹Ρ… чисСл послС удалСния Ρ€ΠΎΠ²Π½ΠΎ k элСмСнтов. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: arr = [5,5,4], k = 1
Output: 1
Explanation: Remove the single 4, only 5 is left.
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΈ построСниС частотного массива: Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ для отслСТивания частот элСмСнтов массива arr. Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΠΉΡ‚Π΅ частоту элСмСнтов Π² Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π΅. 2⃣Бортировка ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ элСмСнтов: Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ массив частот ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ Π΅Π³ΠΎ значСниями ΠΈΠ· Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹. ΠžΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ массив частот. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ для отслСТивания числа ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… элСмСнтов ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ добавляйтС частоты, ΠΏΠΎΠΊΠ° количСство ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… элСмСнтов Π½Π΅ прСвысит k. 3⃣ВозвращСниС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°: Если количСство ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… элСмСнтов прСвысило k, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ ΠΎΡΡ‚Π°Π²ΡˆΠ΅Π΅ΡΡ количСство ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… элСмСнтов. Если всС элСмСнты Π±Ρ‹Π»ΠΈ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ 0. 😎 РСшСниС:
class Solution {
public:
    int findLeastNumOfUniqueInts(vector<int>& arr, int k) {
        unordered_map<int, int> freqMap;
        for (int num : arr) {
            freqMap[num]++;
        }
        
        vector<int> frequencies;
        for (auto& p : freqMap) {
            frequencies.push_back(p.second);
        }
        
        sort(frequencies.begin(), frequencies.end());
        
        int elementsRemoved = 0;
        for (int i = 0; i < frequencies.size(); ++i) {
            elementsRemoved += frequencies[i];
            if (elementsRemoved > k) {
                return frequencies.size() - i;
            }
        }
        
        return 0;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 968. Binary Tree Cameras Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: hard Π’Π°ΠΌ Π΄Π°Π½ ΠΊΠΎΡ€Π΅Π½ΡŒ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π°. ΠœΡ‹ устанавливаСм ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹ Π½Π° ΡƒΠ·Π»Ρ‹ Π΄Π΅Ρ€Π΅Π²Π°, Π³Π΄Π΅ каТдая ΠΊΠ°ΠΌΠ΅Ρ€Π° Π½Π° ΡƒΠ·Π»Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ Π·Π° своим Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΌ, собой ΠΈ своими нСпосрСдствСнными Π΄Π΅Ρ‚ΡŒΠΌΠΈ. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ минимальноС количСство ΠΊΠ°ΠΌΠ΅Ρ€, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… для наблюдСния Π·Π° всСми ΡƒΠ·Π»Π°ΠΌΠΈ Π΄Π΅Ρ€Π΅Π²Π°. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: root = [0,0,null,0,null,0,null,null,0]
Output: 2
Explanation: At least two cameras are needed to monitor all nodes of the tree. The above image shows one of the valid configurations of camera placement.
πŸ‘¨β€πŸ’» Алгоритм: 1⃣РСкурсивноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ (solve): Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ Ρ‚Ρ€ΠΈ состояния: - [State 0] Π‘Ρ‚Ρ€ΠΎΠ³ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ: всС ΡƒΠ·Π»Ρ‹ Π½ΠΈΠΆΠ΅ этого ΡƒΠ·Π»Π° ΠΏΠΎΠΊΡ€Ρ‹Ρ‚Ρ‹, Π½ΠΎ Π½Π΅ сам ΡƒΠ·Π΅Π». - [State 1] ΠΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ: всС ΡƒΠ·Π»Ρ‹ Π½ΠΈΠΆΠ΅ ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ этот ΡƒΠ·Π΅Π» ΠΏΠΎΠΊΡ€Ρ‹Ρ‚Ρ‹, Π½ΠΎ Π½Π° этом ΡƒΠ·Π»Π΅ Π½Π΅Ρ‚ ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹. - [State 2] УстановлСнная ΠΊΠ°ΠΌΠ΅Ρ€Π°: всС ΡƒΠ·Π»Ρ‹ Π½ΠΈΠΆΠ΅ ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ этот ΡƒΠ·Π΅Π» ΠΏΠΎΠΊΡ€Ρ‹Ρ‚Ρ‹, ΠΈ Π½Π° этом ΡƒΠ·Π»Π΅ установлСна ΠΊΠ°ΠΌΠ΅Ρ€Π°. РассчитайтС эти состояния для Π»Π΅Π²ΠΎΠ³ΠΎ ΠΈ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π². 2⃣Рассчёт состояний: Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΡŒ строгоС ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ, Π΄Π΅Ρ‚ΠΈ этого ΡƒΠ·Π»Π° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² состоянии 1. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ Π±Π΅Π· установки ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹ Π½Π° этом ΡƒΠ·Π»Π΅, Π΄Π΅Ρ‚ΠΈ этого ΡƒΠ·Π»Π° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² состояниях 1 ΠΈΠ»ΠΈ 2, ΠΈ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· этих Π΄Π΅Ρ‚Π΅ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π² состоянии 2. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΏΡ€ΠΈ установкС ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹ Π½Π° этом ΡƒΠ·Π»Π΅, Π΄Π΅Ρ‚ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² любом состоянии. 3βƒ£ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ количСство ΠΊΠ°ΠΌΠ΅Ρ€: ЗапуститС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ solve Π½Π° ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌ ΡƒΠ·Π»Π΅ ΠΈ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ минимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ состояниями 1 ΠΈ 2. 😎 РСшСниС:
class Solution {
public:
    int minCameraCover(TreeNode* root) {
        int ans[3];
        solve(root, ans);
        return min(ans[1], ans[2]);
    }

private:
    void solve(TreeNode* node, int* res) {
        if (!node) {
            res[0] = res[1] = 0;
            res[2] = 99999;
            return;
        }

        int L[3], R[3];
        solve(node->left, L);
        solve(node->right, R);

        res[0] = L[1] + R[1];
        res[1] = min(L[2] + min(R[1], R[2]), R[2] + min(L[1], L[2]));
        res[2] = 1 + min(L[0], min(L[1], L[2])) + min(R[0], min(R[1], R[2]));
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 985. Sum of Even Numbers After Queries Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ цСлочислСнный массив nums ΠΈ массив queries, Π³Π΄Π΅ queries[i] = [vali, indexi]. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ запроса i, сначала ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ nums[indexi] = nums[indexi] + vali, Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π²Π΅Π΄ΠΈΡ‚Π΅ сумму Ρ‡Π΅Ρ‚Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ nums. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ цСлочислСнный массив answer, Π³Π΄Π΅ answer[i] - это ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° i-ΠΉ запрос. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: nums = [1], queries = [[4,0]]
Output: [0]
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…: ЗавСсти ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ evenSum для хранСния суммы всСх Ρ‡Π΅Ρ‚Π½Ρ‹Ρ… чисСл Π² массивС nums. ΠŸΡ€ΠΎΠΉΡ‚ΠΈ ΠΏΠΎ массиву nums ΠΈ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ evenSum, слоТив всС Ρ‡Π΅Ρ‚Π½Ρ‹Π΅ числа Π² nums. 2βƒ£ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° запросов: Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ пустой массив result для хранСния ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ запрос. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ запроса [val, index] ΠΈΠ· массива queries Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия: Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ nums[index] Ρ‡Π΅Ρ‚Π½ΠΎΠ΅, Π²Ρ‹Ρ‡Π΅ΡΡ‚ΡŒ Π΅Π³ΠΎ ΠΈΠ· evenSum. ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ nums[index] Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ val. Если Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ nums[index] Ρ‡Π΅Ρ‚Π½ΠΎΠ΅, Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΊ evenSum. Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ evenSum Π² массив result. 3⃣Возврат Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°: Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒ массив result, содСрТащий ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ Π½Π° всС запросы. 😎 РСшСниС:
class Solution {
public:
    vector<int> sumEvenAfterQueries(vector<int>& nums, vector<vector<int>>& queries) {
        int evenSum = 0;
        for (int num : nums) {
            if (num % 2 == 0) {
                evenSum += num;
            }
        }

        vector<int> result;
        for (const auto& query : queries) {
            int val = query[0], index = query[1];
            if (nums[index] % 2 == 0) {
                evenSum -= nums[index];
            }
            nums[index] += val;
            if (nums[index] % 2 == 0) {
                evenSum += nums[index];
            }
            result.push_back(evenSum);
        }
        
        return result;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 437. Path Sum III Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ ΠΊΠΎΡ€Π΅Π½ΡŒ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π° ΠΈ Ρ†Π΅Π»ΠΎΠ΅ число targetSum, Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ количСство ΠΏΡƒΡ‚Π΅ΠΉ, Π³Π΄
Π—Π°Π΄Π°Ρ‡Π°: 437. Path Sum III Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ ΠΊΠΎΡ€Π΅Π½ΡŒ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π° ΠΈ Ρ†Π΅Π»ΠΎΠ΅ число targetSum, Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ количСство ΠΏΡƒΡ‚Π΅ΠΉ, Π³Π΄Π΅ сумма Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ вдоль ΠΏΡƒΡ‚ΠΈ Ρ€Π°Π²Π½Π° targetSum. ΠŸΡƒΡ‚ΡŒ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ ΠΈΠ»ΠΈ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΊΠΎΡ€Π½Π΅ ΠΈΠ»ΠΈ Π½Π° листС, Π½ΠΎ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠ΄Ρ‚ΠΈ Π²Π½ΠΈΠ· (Ρ‚.Π΅. ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΡƒΠ·Π»ΠΎΠ² ΠΊ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ). ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8
Output: 3
Explanation: The paths that sum to 8 are shown.
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ счСтчик ΠΏΡƒΡ‚Π΅ΠΉ Π² Π΄Π΅Ρ€Π΅Π²Π΅ count = 0 ΠΈ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ h, Π³Π΄Π΅ ΠΊΠ»ΡŽΡ‡ - это прСфиксная сумма, Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ - сколько Ρ€Π°Π· ΠΎΠ½Π° Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Π»Π°ΡΡŒ. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ рСкурсивный ΠΎΠ±Ρ…ΠΎΠ΄ Π΄Π΅Ρ€Π΅Π²Π° Π² порядкС preorder: ΡƒΠ·Π΅Π» -> Π»Π΅Π²Ρ‹ΠΉ -> ΠΏΡ€Π°Π²Ρ‹ΠΉ. Ѐункция preorder(node: TreeNode, curr_sum: int) ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°: ΡƒΠ·Π΅Π» Π΄Π΅Ρ€Π΅Π²Π° ΠΈ ΠΏΡ€Π΅Ρ„ΠΈΠΊΡΠ½ΡƒΡŽ сумму ΠΏΠ΅Ρ€Π΅Π΄ этим ΡƒΠ·Π»ΠΎΠΌ. Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ, Π²Ρ‹Π·ΠΎΠ²Π΅ΠΌ preorder(root, 0). 2⃣Бначала ΠΎΠ±Π½ΠΎΠ²ΠΈΠΌ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΏΡ€Π΅Ρ„ΠΈΠΊΡΠ½ΡƒΡŽ сумму, Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΡƒΠ·Π»Π°: curr_sum += node.val. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ счСтчик. Рассмотрим Π΄Π²Π΅ ситуации. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΉ ситуации ΠΏΡƒΡ‚ΡŒ Π² Π΄Π΅Ρ€Π΅Π²Π΅ с Ρ†Π΅Π»Π΅Π²ΠΎΠΉ суммой начинаСтся с корня. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ тСкущая прСфиксная сумма Ρ€Π°Π²Π½Π° Ρ†Π΅Π»Π΅Π²ΠΎΠΉ суммС curr_sum == k, поэтому ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ счСтчик Π½Π° 1: count += 1. Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ситуации ΠΏΡƒΡ‚ΡŒ с Ρ†Π΅Π»Π΅Π²ΠΎΠΉ суммой начинаСтся Π³Π΄Π΅-Ρ‚ΠΎ Π½ΠΈΠΆΠ΅. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ счСтчику количСство Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ ΠΏΡ€Π΅Ρ„ΠΈΠΊΡΠ½ΡƒΡŽ сумму curr_sum - target: count += h[curr_sum - target]. 3⃣Логика проста: тСкущая прСфиксная сумма - это curr_sum, Π° нСсколько элСмСнтов Π½Π°Π·Π°Π΄ прСфиксная сумма Π±Ρ‹Π»Π° curr_sum - target. ВсС элСмСнты ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ ΡΡƒΠΌΠΌΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π΄ΠΎ curr_sum - (curr_sum - target) = target. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ±Π½ΠΎΠ²ΠΈΠΌ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ: h[curr_sum] += 1. ΠŸΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ Π»Π΅Π²ΠΎΠ΅ ΠΈ ΠΏΡ€Π°Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΡŒΡ: preorder(node.left, curr_sum), preorder(node.right, curr_sum). ПослС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²Π° ΡƒΠ΄Π°Π»ΠΈΠΌ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΏΡ€Π΅Ρ„ΠΈΠΊΡΠ½ΡƒΡŽ сумму ΠΈΠ· Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΡΠΌΠ΅ΡˆΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΡŒΡ: h[curr_sum] -= 1. Когда ΠΎΠ±Ρ…ΠΎΠ΄ Π² порядкС preorder Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½, счСтчик ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½. Π’Π΅Ρ€Π½Π΅ΠΌ Π΅Π³ΠΎ. 😎 РСшСниС:
class Solution {
public:
    int pathSum(TreeNode* root, int sum) {
        int count = 0;
        int k = sum;
        unordered_map<int, int> h;
        preorder(root, 0, h, count, k);
        return count;
    }
    
    void preorder(TreeNode* node, int curr_sum, unordered_map<int, int>& h, int& count, int k) {
        if (!node) return;
        
        curr_sum += node->val;
        
        if (curr_sum == k) {
            count++;
        }
        
        count += h[curr_sum - k];
        
        h[curr_sum]++;
        
        preorder(node->left, curr_sum, h, count, k);
        preorder(node->right, curr_sum, h, count, k);
        
        h[curr_sum]--;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

πŸ”₯ Записал видос "Как Π·Π° 3 ΠΌΠΈΠ½ΡƒΡ‚Ρ‹ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Автоотклики Π½Π° вакансии HeadHunter" большС Π½Π΅ придСтся Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ этой ΡƒΠ½Ρ‹Π»ΠΎΠΉ Ρ€ΡƒΡ‚
πŸ”₯ Записал видос "Как Π·Π° 3 ΠΌΠΈΠ½ΡƒΡ‚Ρ‹ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Автоотклики Π½Π° вакансии HeadHunter" большС Π½Π΅ придСтся Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ этой ΡƒΠ½Ρ‹Π»ΠΎΠΉ Ρ€ΡƒΡ‚ΠΈΠ½ΠΎΠΉ πŸ“Ί Π’ΠΈΠ΄Π΅ΠΎ: https://youtu.be/G_FOwEGPwlw

Π—Π°Π΄Π°Ρ‡Π°: 1268. Search Suggestions System Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π’Π°ΠΌ Π΄Π°Π½ массив строк products ΠΈ строка searchWord. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°ΠΉΡ‚Π΅ систСму, которая ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ Ρ‚Ρ€Π΅Ρ… Π½Π°Π·Π²Π°Π½ΠΈΠΉ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² послС Π²Π²ΠΎΠ΄Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ символа searchWord. ΠŸΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΡ‹Π΅ Ρ‚ΠΎΠ²Π°Ρ€Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΉ прСфикс с searchWord. Если Π΅ΡΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Ρ‚Ρ€Π΅Ρ… ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² с ΠΎΠ±Ρ‰ΠΈΠΌ прСфиксом, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Ρ‚Ρ€ΠΈ лСксикографичСски ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°. ВозвращаСтся список списков ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² послС Π²Π²ΠΎΠ΄Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ символа searchWord. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: products = ["havana"], searchWord = "havana"
Output: [["havana"],["havana"],["havana"],["havana"],["havana"],["havana"]]
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£ΠžΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ массив ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ². 2βƒ£Π˜Ρ‚Π΅Ρ€ΠΈΡ€ΡƒΠΉΡ‚Π΅ΡΡŒ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ символу Π² searchWord, Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ всС ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌΡƒ прСфиксу. 3⃣БохраняйтС Π½Π΅ Π±ΠΎΠ»Π΅Π΅ Ρ‚Ρ€Π΅Ρ… лСксикографичСски ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ прСфикса. 😎 РСшСниС:
class Solution {
public:
    vector<vector<string>> suggestedProducts(vector<string>& products, string searchWord) {
        sort(products.begin(), products.end());
        vector<vector<string>> result;
        string prefix = "";
        for (char c : searchWord) {
            prefix += c;
            vector<string> suggestions;
            for (const string& product : products) {
                if (product.find(prefix) == 0) {
                    suggestions.push_back(product);
                    if (suggestions.size() == 3) break;
                }
            }
            result.push_back(suggestions);
        }
        return result;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 786. K-th Smallest Prime Fraction Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π’Π°ΠΌ Π΄Π°Π½ отсортированный массив Ρ†Π΅Π»Ρ‹Ρ… чисСл arr, содСрТащий 1 ΠΈ простыС числа, Π³Π΄Π΅ всС элСмСнты массива arr ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹. Π’Π°ΠΊΠΆΠ΅ Π΄Π°Π½ΠΎ Ρ†Π΅Π»ΠΎΠ΅ число k. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ i ΠΈ j, Π³Π΄Π΅ 0 <= i < j < arr.length, ΠΌΡ‹ рассматриваСм Π΄Ρ€ΠΎΠ±ΡŒ arr[i] / arr[j]. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ k-ΡƒΡŽ Π½Π°ΠΈΠΌΠ΅Π½ΡŒΡˆΡƒΡŽ Π΄Ρ€ΠΎΠ±ΡŒ ΠΈΠ· рассмотрСнных. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ ΠΎΡ‚Π²Π΅Ρ‚ Π² Π²ΠΈΠ΄Π΅ массива ΠΈΠ· Π΄Π²ΡƒΡ… Ρ†Π΅Π»Ρ‹Ρ… чисСл Ρ€Π°Π·ΠΌΠ΅Ρ€Π° 2, Π³Π΄Π΅ answer[0] == arr[i] ΠΈ answer[1] == arr[j]. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: arr = [1,2,3,5], k = 3
Output: [2,5]
Explanation: The fractions to be considered in sorted order are:
1/5, 1/3, 2/5, 1/2, 3/5, and 2/3.
The third fraction is 2/5.
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΡƒΡΡ‚ΡƒΡŽ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ pq для хранСния ΠΏΠ°Ρ€ Π΄Ρ€ΠΎΠ±Π΅ΠΉ ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΈΠΌ индСксов. Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ ΠΏΡ€ΠΎΠΉΠ΄ΠΈΡ‚Π΅ ΠΏΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΌΡƒ массиву arr, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ†ΠΈΠΊΠ»Π° i. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта arr[i] вычислитС Π΄Ρ€ΠΎΠ±ΡŒ, ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Π΅Π³ΠΎ Π½Π° наибольший элСмСнт Π² массивС (arr[arr.size() - 1]). ΠŸΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚Π΅ ΠΏΠ°Ρ€Ρƒ, ΡΠΎΡΡ‚ΠΎΡΡ‰ΡƒΡŽ ΠΈΠ· ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния Π΄Ρ€ΠΎΠ±ΠΈ (-1.0 * arr[i] / arr[arr.size() - 1]) ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… индСксов (i для числитСля ΠΈ arr.size() - 1 для знамСнатСля), Π² ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ pq. ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Π°Ρ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ pq Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ содСрТит всС Π΄Ρ€ΠΎΠ±ΠΈ, ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Π½Π° наибольший элСмСнт Π² массивС, отсортированныС Π² порядкС возрастания Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π΄Ρ€ΠΎΠ±Π΅ΠΉ. 2βƒ£ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ шаги k - 1 Ρ€Π°Π·: ΡƒΠ΄Π°Π»ΠΈΡ‚Π΅ Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ элСмСнт (Π½Π°ΠΈΠΌΠ΅Π½ΡŒΡˆΡƒΡŽ Π΄Ρ€ΠΎΠ±ΡŒ) ΠΈΠ· ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ pq ΠΈ сохранитС Π΅Π³ΠΎ индСксы Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ cur. Π£ΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚Π΅ индСкс знамСнатСля (cur[1]--). ВычислитС Π½ΠΎΠ²ΡƒΡŽ Π΄Ρ€ΠΎΠ±ΡŒ, ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ числитСля Π² cur[0] Π½Π° ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½Π½Ρ‹ΠΉ Π·Π½Π°ΠΌΠ΅Π½Π°Ρ‚Π΅Π»ΡŒ (arr[cur[1]]). ΠŸΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚Π΅ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄Ρ€ΠΎΠ±ΠΈ (-1.0 * arr[cur[0]] / arr[cur[1]]) ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ индСксы (cur[0] для числитСля ΠΈ cur[1] для знамСнатСля) Π² ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ pq. ПослС k - 1 ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ элСмСнт ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ pq Π±ΡƒΠ΄Π΅Ρ‚ k-ΠΉ наимСньшСй Π΄Ρ€ΠΎΠ±ΡŒΡŽ. 3βƒ£Π˜Π·Π²Π»Π΅ΠΊΠΈΡ‚Π΅ индСксы числитСля ΠΈ знамСнатСля ΠΈΠ· Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ элСмСнта ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈ сохранитС ΠΈΡ… Π² result. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ массив, содСрТащий значСния числитСля (arr[result[0]]) ΠΈ знамСнатСля (arr[result[1]]), ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ k-ΠΉ наимСньшСй Π΄Ρ€ΠΎΠ±ΠΈ. 😎 РСшСниС:
#include <queue>
#include <vector>

class Solution {
public:
    std::vector<int> kthSmallestPrimeFraction(std::vector<int>& arr, int k) {
        auto comp = [&arr](std::pair<int, int>& a, std::pair<int, int>& b) {
            return arr[a.first] * arr[b.second] > arr[a.second] * arr[b.first];
        };
        
        std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int>>, decltype(comp)> pq(comp);
        
        for (int i = 0; i < arr.size() - 1; i++) {
            pq.emplace(i, arr.size() - 1);
        }
        
        for (int i = 0; i < k - 1; i++) {
            auto [numeratorIndex, denominatorIndex] = pq.top();
            pq.pop();
            if (denominatorIndex - 1 > numeratorIndex) {
                pq.emplace(numeratorIndex, denominatorIndex - 1);
            }
        }
        
        auto [numeratorIndex, denominatorIndex] = pq.top();
        return {arr[numeratorIndex], arr[denominatorIndex]};
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 44. Wildcard Matching Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: hard Π”Π°Π½Π° входная строка s ΠΈ шаблон p, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ сопоставлСниС с шаблоном с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆ
Π—Π°Π΄Π°Ρ‡Π°: 44. Wildcard Matching Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: hard Π”Π°Π½Π° входная строка s ΠΈ шаблон p, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ сопоставлСниС с шаблоном с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ символов: ? β€” соотвСтствуСт Π»ΡŽΠ±ΠΎΠΌΡƒ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠΌΡƒ символу * β€” соотвСтствуСт любой ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ символов (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΡƒΡΡ‚ΡƒΡŽ) БопоставлСниС Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΠΎΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ всю строку. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: s = "aa", p = "a" Output: false
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π£Π΄Π°Π»ΠΈΡ‚ΡŒ Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚Ρ‹ Π·Π²Ρ‘Π·Π΄ΠΎΡ‡Π΅ΠΊ (** β†’ *), Ρ‚.ΠΊ. ΠΎΠ½ΠΈ Π½Π΅ Π΄Π°ΡŽΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ 2βƒ£Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ helper, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΌΠ΅ΠΌΠΎΠΈΠ·Π°Ρ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½Ρ‹Ρ… вычислСний 3βƒ£ΠžΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ шаблон ΠΏΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ: Если p[i] == s[i] ΠΈΠ»ΠΈ p[i] == '?' β†’ рСкурсивно ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠ°Ρ€Π΅ Если p[i] == '*' β†’ Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°: ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ * ΠΈΠ»ΠΈ ΡΠΎΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ с символом строки Π˜Π½Π°Ρ‡Π΅ β€” нСсовпадСниС 😎 РСшСниС:
class Solution {
public:
    unordered_map<string, bool> dp;
    string p;
    string s;

    string remove_duplicate_stars(string p) {
        string new_string = "";
        for (auto &c : p) {
            if (new_string.empty() || c != '*')
                new_string += c;
            else if (new_string.back() != '*')
                new_string += c;
        }
        return new_string;
    }

    bool helper(int si, int pi) {
        string key = to_string(si) + "," + to_string(pi);
        if (dp.count(key)) return dp[key];
        
        if (pi == p.size())
            dp[key] = (si == s.size());
        else if (si == s.size())
            dp[key] = (pi + 1 == p.size() && p[pi] == '*');
        else if (p[pi] == s[si] || p[pi] == '?')
            dp[key] = helper(si + 1, pi + 1);
        else if (p[pi] == '*')
            dp[key] = helper(si, pi + 1) || helper(si + 1, pi);
        else
            dp[key] = false;

        return dp[key];
    }

    bool isMatch(string s, string p) {
        dp.clear();
        this->s = s;
        this->p = remove_duplicate_stars(p);
        return helper(0, 0);
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 955. Delete Columns to Make Sorted II Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π’Π°ΠΌ Π΄Π°Π½ массив ΠΈΠ· n строк ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ индСксы удалСния ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ всС символы Π² этих индСксах для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки. НапримСр, Ссли Ρƒ нас Π΅ΡΡ‚ΡŒ strs = ["abcdef", "uvwxyz"] ΠΈ индСксы удалСния {0, 2, 3}, Ρ‚ΠΎ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ массив послС удалСния Π±ΡƒΠ΄Π΅Ρ‚ ["bef", "vyz"]. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π²Ρ‹Π±Ρ€Π°Π»ΠΈ Π½Π°Π±ΠΎΡ€ индСксов удалСния answer Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ послС удалСния ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ массив ΠΈΠΌΠ΅Π΅Ρ‚ элСмСнты Π² лСксикографичСском порядкС (Ρ‚.Π΅, strs[0] <= strs[1] <= strs[2] <= ... <= strs[n - 1]). Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ минимально Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ answer.length. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: strs = ["ca","bb","ac"]
Output: 1
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ количСство строк n ΠΈ Π΄Π»ΠΈΠ½Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки m. Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ массив delete_count Π΄Π»ΠΈΠ½ΠΎΠΉ m, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ количСство удаляСмых столбцов. 2βƒ£Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΏΠ°Ρ€Ρƒ сосСдних строк для всСх столбцов. Если для Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠ°Ρ€Ρ‹ строк ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΎ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ лСксикографичСского порядка, ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ столбСц для удалСния. 3βƒ£ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ процСсс Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° массив строк Π½Π΅ станСт лСксикографичСски отсортированным. Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒ количСство ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… столбцов. 😎 РСшСниС:
class Solution {
public:
    int minDeletionSize(vector<string>& strs) {
        int n = strs.size();
        int m = strs[0].length();
        vector<bool> deleteCount(m, false);
        
        auto isSorted = [&]() {
            for (int i = 0; i < n - 1; i++) {
                for (int j = 0; j < m; j++) {
                    if (deleteCount[j]) continue;
                    if (strs[i][j] > strs[i + 1][j]) return false;
                    if (strs[i][j] < strs[i + 1][j]) break;
                }
            }
            return true;
        };
        
        while (!isSorted()) {
            for (int j = 0; j < m; j++) {
                if (deleteCount[j]) continue;
                for (int i = 0; i < n - 1; i++) {
                    if (strs[i][j] > strs[i + 1][j]) {
                        deleteCount[j] = true;
                        break;
                    }
                }
                if (deleteCount[j]) break;
            }
        }
        
        return count(deleteCount.begin(), deleteCount.end(), true);
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ