en
Feedback
C/C++ | LeetCode

C/C++ | LeetCode

Open in Telegram

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

Show more
3 239
Subscribers
+124 hours
+77 days
-430 days
Posts Archive
Π—Π°Π΄Π°Ρ‡Π°: 23. Merge k Sorted Lists Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π’Π°ΠΌ Π΄Π°Π½ массив ΠΈΠ· k списков связанных списков, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ связанный список отсортирован Π² порядкС возрастания. ΠžΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚Π΅ всС связанныС списки Π² ΠΎΠ΄ΠΈΠ½ отсортированный связанный список ΠΈ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ Π΅Π³ΠΎ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: lists = [[1,4,5],[1,3,4],[2,6]] Output: [1,1,2,3,4,4,5,6]
πŸ‘¨β€πŸ’» Алгоритм: 1⃣БоздаСм min-ΠΊΡƒΡ‡Ρƒ, Π³Π΄Π΅ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ минимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠ·Π»ΠΎΠ². 2βƒ£ΠŸΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ Π² ΠΊΡƒΡ‡Ρƒ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ элСмСнты всСх нСпустых списков. 3βƒ£Π˜Π·Π²Π»Π΅ΠΊΠ°Π΅ΠΌ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт, добавляСм Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, ΠΈ Ссли Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт β€” ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ Π΅Π³ΠΎ Π² ΠΊΡƒΡ‡Ρƒ. 😎 РСшСниС:
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class compare {
public:
    bool operator()(ListNode* a, ListNode* b) {
        return a->val > b->val;
    }
};

class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        if (lists.empty()) return NULL;

        priority_queue<ListNode*, vector<ListNode*>, compare> minheap;
        for (int i = 0; i < lists.size(); i++) {
            if (lists[i] != NULL)
                minheap.push(lists[i]);
        }

        ListNode* head = NULL;
        ListNode* temp1;

        while (!minheap.empty()) {
            ListNode* temp = minheap.top();
            minheap.pop();

            if (head == NULL) {
                head = temp;
                temp1 = temp;
            } else {
                temp1->next = temp;
                temp1 = temp;
            }

            if (temp->next != NULL) {
                minheap.push(temp->next);
            }
        }

        if (temp1 != NULL)
            temp1->next = NULL;

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

Π—Π°Π΄Π°Ρ‡Π°: 1007. Minimum Domino Rotations For Equal Row Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π’ ряду Π΄ΠΎΠΌΠΈΠ½ΠΎ, tops[i] ΠΈ bottoms[i] ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой Π²Π΅Ρ€Ρ…Π½ΡŽΡŽ ΠΈ ниТнюю ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½ΠΊΠΈ i-Π³ΠΎ Π΄ΠΎΠΌΠΈΠ½ΠΎ. (Π”ΠΎΠΌΠΈΠ½ΠΎ - это ΠΏΠ»ΠΈΡ‚ΠΊΠ° с двумя числами ΠΎΡ‚ 1 Π΄ΠΎ 6 - ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π΅ ΠΏΠ»ΠΈΡ‚ΠΊΠΈ.) ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ²Π΅Ρ€Π½ΡƒΡ‚ΡŒ i-Π΅ Π΄ΠΎΠΌΠΈΠ½ΠΎ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ tops[i] ΠΈ bottoms[i] помСнялись значСниями. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ минимальноС количСство ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС значСния tops Π±Ρ‹Π»ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ ΠΈΠ»ΠΈ всС значСния bottoms Π±Ρ‹Π»ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ. Если это Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ -1. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: tops = [2,1,2,4,2,2], bottoms = [5,2,6,2,3,2]
Output: 2
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ΠΎΠ²: Для Π½Π°Ρ‡Π°Π»Π° рассмотрим Π΄Π²Π° ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚Π° для достиТСния Ρ†Π΅Π»ΠΈ: tops[0] ΠΈ bottoms[0]. Π­Ρ‚ΠΎ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚Ρ‹ для ΡƒΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² ряду Π΄ΠΎΠΌΠΈΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ссли Π΅ΡΡ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΎΠ΄ΠΈΠ½ ΠΈΠ· этих Π΄Π²ΡƒΡ… ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ΠΎΠ² Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ ΠΈΠ»ΠΈ Π½ΠΈΠΆΠ½Π΅ΠΉ строкС всСх Π΄ΠΎΠΌΠΈΠ½ΠΎ. 2βƒ£ΠŸΠΎΠ΄ΡΡ‡Π΅Ρ‚ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚ΠΎΠ² для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚Π°: Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ΠΎΠ² (tops[0] ΠΈ bottoms[0]) подсчитайтС количСство ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚ΠΎΠ², Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… для ΡƒΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π²ΠΎ всСх tops ΠΈΠ»ΠΈ Π²ΠΎ всСх bottoms. Если ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π΄ΠΎΠΌΠΈΠ½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Ρ€Π½ΡƒΡ‚ для достиТСния Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚Π°, этот ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΈΠ· рассмотрСния. 3⃣Возврат минимального количСства ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚ΠΎΠ²: Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ минимальноС количСство ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚ΠΎΠ² ΠΈΠ· всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ΠΎΠ². Если Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ -1. 😎 РСшСниС:
class Solution {
public:
    int minDominoRotations(vector<int>& tops, vector<int>& bottoms) {
        auto check = [&](int x) {
            int rotations_a = 0, rotations_b = 0;
            for (int i = 0; i < tops.size(); ++i) {
                if (tops[i] != x && bottoms[i] != x) {
                    return -1;
                } else if (tops[i] != x) {
                    rotations_a++;
                } else if (bottoms[i] != x) {
                    rotations_b++;
                }
            }
            return min(rotations_a, rotations_b);
        };
        
        int rotations = check(tops[0]);
        if (rotations != -1 || tops[0] == bottoms[0]) {
            return rotations;
        } else {
            return check(bottoms[0]);
        }
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 728. Self Dividing Numbers Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: hard НапримСр, 128 являСтся ΡΠ°ΠΌΠΎΡ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΌΡΡ числом, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ 128 % 1 == 0, 128 % 2 == 0 ΠΈ 128 % 8 == 0. Π‘Π°ΠΌΠΎΡ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‰Π΅Π΅ΡΡ число Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ†ΠΈΡ„Ρ€Ρƒ ноль. Если Π΄Π°Π½Ρ‹ Π΄Π²Π° Ρ†Π΅Π»Ρ‹Ρ… числа left ΠΈ right, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ список всСх ΡΠ°ΠΌΠΎΡ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‰ΠΈΡ…ΡΡ чисСл Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ [left, right]. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: left = 1, right = 22
Output: [1,2,3,4,5,6,7,8,9,11,12,15,22]
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£ΠŸΠ΅Ρ€Π΅Π±Π΅Ρ€ΠΈΡ‚Π΅ всС числа Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ‚ left Π΄ΠΎ right. 2⃣Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ числа ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, являСтся Π»ΠΈ ΠΎΠ½ΠΎ ΡΠ°ΠΌΠΎΡ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΌΡΡ: Π Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅ число Π½Π° Π΅Π³ΠΎ Ρ†ΠΈΡ„Ρ€Ρ‹. Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π½ΠΈ ΠΎΠ΄Π½Π° Ρ†ΠΈΡ„Ρ€Π° Π½Π΅ Ρ€Π°Π²Π½Π° Π½ΡƒΠ»ΡŽ ΠΈ число дСлится Π½Π° ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΈΠ· своих Ρ†ΠΈΡ„Ρ€ Π±Π΅Π· остатка. 3βƒ£Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΡΠ°ΠΌΠΎΡ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ числа Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ список ΠΈ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ Π΅Π³ΠΎ. 😎 РСшСниС:
#include <vector>

using namespace std;

class Solution {
public:
    vector<int> selfDividingNumbers(int left, int right) {
        vector<int> result;
        for (int num = left; num <= right; num++) {
            if (isSelfDividing(num)) {
                result.push_back(num);
            }
        }
        return result;
    }

private:
    bool isSelfDividing(int num) {
        int n = num;
        while (n > 0) {
            int digit = n % 10;
            if (digit == 0 || num % digit != 0) {
                return false;
            }
            n /= 10;
        }
        return true;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 1238. Circular Permutation in Binary Representation Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π’Π°ΠΌ Π΄Π°Π½ массив строк arr. Π‘Ρ‚Ρ€ΠΎΠΊΠ° s образуСтся ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠ΅ΠΉ ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ arr, содСрТащСй ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ символы. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ максимально Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ s. ΠŸΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ - это массив, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ массива ΠΏΡƒΡ‚Π΅ΠΌ удалСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠ»ΠΈ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта Π±Π΅Π· измСнСния порядка ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ элСмСнтов. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: arr = ["un","iq","ue"]
Output: 4
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ рСкурсивного ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°: Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки Π² массивС arr провСряСм, ΠΌΠΎΠΆΠ΅ΠΌ Π»ΠΈ ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Π΅ ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… символов. Если ΠΌΠΎΠΆΠ΅ΠΌ, добавляСм Π΅Π΅ ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ рСкурсивный Π²Ρ‹Π·ΠΎΠ² для ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строки. Если Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ, пропускаСм Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ строку ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ. 2βƒ£ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ символов: Для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ символов ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ мноТСство (set). Если всС символы строки ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ ΠΈ Π½Π΅ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‚ΡΡ с символами Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ строку. 3βƒ£ΠŸΠΎΠΈΡΠΊ максимальной Π΄Π»ΠΈΠ½Ρ‹: На ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС обновляСм ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ, Ссли тСкущая комбинация ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… символов Π΄Π»ΠΈΠ½Π½Π΅Π΅ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ максимальной Π΄Π»ΠΈΠ½Ρ‹. 😎 РСшСниС:
class Solution {
public:
    int maxLength(vector<string>& arr) {
        return backtrack(arr, 0, "");
    }

private:
    bool isUnique(const string& s) {
        unordered_set<char> char_set(s.begin(), s.end());
        return char_set.size() == s.size();
    }

    int backtrack(const vector<string>& arr, int index, const string& current) {
        if (!isUnique(current)) return 0;
        int max_length = current.size();
        for (int i = index; i < arr.size(); ++i) {
            max_length = max(max_length, backtrack(arr, i + 1, current + arr[i]));
        }
        return max_length;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 89. Gray Code Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ГрСя Π΄Π»ΠΈΠ½Ρ‹ n β€” это ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ 2^n чисСл ΠΎΡ‚ 0 Π΄ΠΎ 2^n - 1, Π²
Π—Π°Π΄Π°Ρ‡Π°: 89. Gray Code Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ГрСя Π΄Π»ΠΈΠ½Ρ‹ n β€” это ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ 2^n чисСл ΠΎΡ‚ 0 Π΄ΠΎ 2^n - 1, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ число отличаСтся ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ Ρ€ΠΎΠ²Π½ΠΎ Π½Π° ΠΎΠ΄ΠΈΠ½ Π±ΠΈΡ‚, ΠΈ Π½ΠΈ ΠΎΠ΄Π½ΠΎ число Π½Π΅ повторяСтся. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: n = 2
Output: [0,1,3,2]
ПояснСниС: Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Π²ΠΈΠ΄: [00, 01, 11, 10]
πŸ‘¨β€πŸ’» Алгоритм: 1⃣НачинаСм с добавлСния 0 Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ β€” всС ΠΊΠΎΠ΄Ρ‹ ГрСя Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с нуля. 2βƒ£Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ DFS с backtracking: ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅ΠΌ числа, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π½Π° ΠΎΠ΄ΠΈΠ½ Π±ΠΈΡ‚ (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ current ^ (1 << i)). 3⃣Π₯Ρ€Π°Π½ΠΈΠΌ ΡƒΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ числа Π² unordered_set, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ повторСния. Если Π΄Π»ΠΈΠ½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° достигла 2^n, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ true. Π˜Π½Π°Ρ‡Π΅ ΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ подходящСС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ число. Если Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎ β€” откатываСмся Π½Π°Π·Π°Π΄. 😎 РСшСниС:
class Solution {
public:
    vector<int> grayCode(int n) {
        vector<int> result;
        result.push_back(0);
        unordered_set<int> isPresent;
        isPresent.insert(0);
        grayCodeHelper(result, n, isPresent);
        return result;
    }

private:
    bool grayCodeHelper(vector<int> &result, int n,
                        unordered_set<int> &isPresent) {
        if (result.size() == (1 << n)) return true;

        int current = result.back();
        for (int i = 0; i < n; i++) {
            int next = current ^ (1 << i);
            if (isPresent.find(next) == isPresent.end()) {
                result.push_back(next);
                isPresent.insert(next);
                if (grayCodeHelper(result, n, isPresent)) return true;
                isPresent.erase(next);
                result.pop_back();
            }
        }
        return false;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 775. Global and Local Inversions Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ массив Ρ†Π΅Π»Ρ‹Ρ… чисСл nums Π΄Π»ΠΈΠ½ΠΎΠΉ n, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт собой пСрСстановку всСх чисСл Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ [0, n - 1]. Число Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… инвСрсий β€” это количСство Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠ°Ρ€ (i, j), Π³Π΄Π΅: 0 <= i < j < n nums[i] > nums[j] Число Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… инвСрсий β€” это количСство индСксов i, Π³Π΄Π΅: 0 <= i < n - 1 nums[i] > nums[i + 1] Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ true, Ссли количСство Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… инвСрсий Ρ€Π°Π²Π½ΠΎ количСству Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… инвСрсий. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: nums = [1,0,2]
Output: true
Explanation: There is 1 global inversion and 1 local inversion.
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π›ΠΎΠΊΠ°Π»ΡŒΠ½Π°Ρ инвСрсия Ρ‚Π°ΠΊΠΆΠ΅ являСтся глобальной инвСрсиСй. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π΅ΡΡ‚ΡŒ Π»ΠΈ Π² нашСй пСрСстановкС ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ Π½Π΅Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ инвСрсии (A[i] > A[j], i < j) с j - i > 1. 2⃣Для этого ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π±Ρ€Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ индСкс i ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π΅ΡΡ‚ΡŒ Π»ΠΈ индСкс j, Ρ‚Π°ΠΊΠΎΠΉ Ρ‡Ρ‚ΠΎ j > i + 1 ΠΈ nums[i] > nums[j]. Если Ρ‚Π°ΠΊΠΎΠΉ индСкс Π½Π°ΠΉΠ΄Π΅Π½, это Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ нСлокальной инвСрсии. 3⃣Если для всСх индСксов i условиС Π²Ρ‹ΡˆΠ΅ Π½Π΅ выполняСтся, это Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ количСство Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… инвСрсий Ρ€Π°Π²Π½ΠΎ количСству Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… инвСрсий, ΠΈ ΠΌΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ true. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС, Ссли хотя Π±Ρ‹ ΠΎΠ΄Π½Π° нСлокальная инвСрсия Π½Π°ΠΉΠ΄Π΅Π½Π°, ΠΌΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ false. 😎 РСшСниС:
class Solution {
public:
    bool isIdealPermutation(vector<int>& A) {
        int N = A.size();
        for (int i = 0; i < N; ++i)
            for (int j = i + 2; j < N; ++j)
                if (A[i] > A[j]) return false;
        return true;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 1283. Find the Smallest Divisor Given a Threshold Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ массив Ρ†Π΅Π»Ρ‹Ρ… чисСл nums ΠΈ Ρ†Π΅Π»ΠΎΠ΅ число threshold. ΠœΡ‹ Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ†Π΅Π»Ρ‹ΠΉ Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ, Ρ€Π°Π·Π΄Π΅Π»ΠΈΠΌ всС элСмСнты массива Π½Π° Π½Π΅Π³ΠΎ ΠΈ суммируСм Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ дСлСния. НайдитС наимСньший Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ, Ρ‚Π°ΠΊΠΎΠΉ Ρ‡Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, упомянутый Π²Ρ‹ΡˆΠ΅, мСньшС ΠΈΠ»ΠΈ Ρ€Π°Π²Π΅Π½ threshold. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ дСлСния округляСтся Π΄ΠΎ блиТайшСго большСго Ρ†Π΅Π»ΠΎΠ³ΠΎ числа. (НапримСр: 7/3 = 3 ΠΈ 10/2 = 5). ГарантируСтся, Ρ‡Ρ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ сущСствуСт. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: nums = [1,2,5,9], threshold = 6
Output: 5
Explanation: We can get a sum to 17 (1+2+5+9) if the divisor is 1. 
If the divisor is 4 we can get a sum of 7 (1+1+2+3) and if the divisor is 5 the sum will be 5 (1+1+1+2). 
πŸ‘¨β€πŸ’» Алгоритм: 1⃣НайдитС ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт массива nums ΠΈ сохранитС Π΅Π³ΠΎ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ maxElement. 2βƒ£Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΡ ΠΏΠΎ всСм дСлитСлям ΠΎΡ‚ 1 Π΄ΠΎ maxElement: Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π΄Π²Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅: sumOfDivisionResults для хранСния суммы Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² дСлСния ΠΈ thresholdExceeded для указания, ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ Π»ΠΈ ΠΏΠΎΡ€ΠΎΠ³. Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΡ ΠΏΠΎ всСм элСмСнтам массива nums: Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ дСлСния, ΠΎΠΊΡ€ΡƒΠ³Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π΄ΠΎ блиТайшСго большСго Ρ†Π΅Π»ΠΎΠ³ΠΎ числа, Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ sumOfDivisionResults. Если сумма ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ threshold, установитС thresholdExceeded Π² true ΠΈ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚Π΅ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ ΠΏΠΎ массиву nums. 3βƒ£ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Π±Ρ‹Π» Π»ΠΈ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ ΠΏΠΎΡ€ΠΎΠ³: Если ΠΏΠΎΡ€ΠΎΠ³ Π½Π΅ Π±Ρ‹Π» ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½, Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ являСтся наимСньшим Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΌ, поэтому Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ Π΅Π³ΠΎ. Если Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ дСлитСля, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ -1. 😎 РСшСниС:
class Solution {
public:
    int smallestDivisor(vector<int>& nums, int threshold) {
        int maxElement = *max_element(nums.begin(), nums.end());
        
        for (int divisor = 1; divisor <= maxElement; ++divisor) {
            int sumOfDivisionResults = 0;
            bool thresholdExceeded = true;
            
            for (int num : nums) {
                sumOfDivisionResults += (num + divisor - 1) / divisor;
                if (sumOfDivisionResults > threshold) {
                    thresholdExceeded = false;
                    break;
                }
            }
            
            if (thresholdExceeded) {
                return divisor;
            }
        }
        
        return -1;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 1353. Maximum Number of Events That Can Be Attended Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ массив событий, Π³Π΄Π΅ events[i] = [startDayi, endDayi]. КаТдоС событиС i начинаСтся Π² startDayi ΠΈ заканчиваСтся Π² endDayi. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡΠ΅Ρ‚ΠΈΡ‚ΡŒ событиС i Π² любой дСнь d, Π³Π΄Π΅ startDayi <= d <= endDayi. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡΠ΅Ρ‰Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ событиС Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ d. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ максимальноС количСство событий, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡΠ΅Ρ‚ΠΈΡ‚ΡŒ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: events= [[1,2],[2,3],[3,4],[1,2]]
Output: 4
πŸ‘¨β€πŸ’» Алгоритм: 1⃣Бортировка событий ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ: Π‘Π½Π°Ρ‡Π°Π»Π° отсортируйтС массив событий ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ окончания ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ события Π² порядкС возрастания. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ сначала Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ события, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρ€Π°Π½ΡŒΡˆΠ΅. 2βƒ£Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ мноТСства для отслСТивания посСщСнных Π΄Π½Π΅ΠΉ: Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ мноТСство для хранСния Π΄Π½Π΅ΠΉ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΈ посСщСны события. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, Π±Ρ‹Π» Π»ΠΈ дСнь ΡƒΠΆΠ΅ использован для посСщСния Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ события. 3βƒ£ΠŸΠΎΡΠ΅Ρ‰Π΅Π½ΠΈΠ΅ событий Π² доступныС Π΄Π½ΠΈ: ΠŸΡ€ΠΎΠΉΠ΄ΠΈΡ‚Π΅ΡΡŒ ΠΏΠΎ отсортированному массиву событий. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ события ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ дСнь ΠΎΡ‚ Π½Π°Ρ‡Π°Π»Π° события Π΄ΠΎ Π΅Π³ΠΎ окончания ΠΈ Π½Π°ΠΉΠ΄ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ доступный дСнь, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅Ρ‰Π΅ Π½Π΅ Π±Ρ‹Π» использован. Если Ρ‚Π°ΠΊΠΎΠΉ дСнь Π½Π°ΠΉΠ΄Π΅Π½, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π΅Π³ΠΎ Π² мноТСство ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΡŒΡ‚Π΅ счСтчик посСщСнных событий. 😎 РСшСниС:
class Solution {
public:
    int maxEvents(vector<vector<int>>& events) {
        sort(events.begin(), events.end(), [](const vector<int>& a, const vector<int>& b) {
            return a[1] < b[1];
        });
        set<int> visitedDays;
        int count = 0;
        
        for (const auto& event : events) {
            for (int day = event[0]; day <= event[1]; day++) {
                if (visitedDays.find(day) == visitedDays.end()) {
                    visitedDays.insert(day);
                    count++;
                    break;
                }
            }
        }
        return count;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 721. Accounts Merge Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ список Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ΠΎΠ², Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт accounts[i] - это список строк,
Π—Π°Π΄Π°Ρ‡Π°: 721. Accounts Merge Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ список Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ΠΎΠ², Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт accounts[i] - это список строк, Π³Π΄Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт accounts[i][0] - это имя, Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ элСмСнты - это email, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ ΡΠ»Π΅ΠΊΡ‚Ρ€ΠΎΠ½Π½ΡƒΡŽ ΠΏΠΎΡ‡Ρ‚Ρƒ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π°. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ эти Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Ρ‹. Π”Π²Π° Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ ΠΎΠ΄Π½ΠΎΠΌΡƒ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΡƒ, Ссли Ρƒ ΠΎΠ±ΠΎΠΈΡ… Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ΠΎΠ² Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΎΠ±Ρ‰ΠΈΠΉ email. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π΄Π°ΠΆΠ΅ Ссли Π΄Π²Π° Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π° ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ имя, ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹ΠΌ людям, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρƒ людСй ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π°. Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Ρƒ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ любоС количСство счСтов, Π½ΠΎ всС Π΅Π³ΠΎ счСта ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ имя. ПослС объСдинСния счСтов Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ счСта Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅: ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ счСта - имя, Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ элСмСнты - элСктронныС письма Π² отсортированном порядкС. Π‘Π°ΠΌΠΈ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Ρ‹ Π² любом порядкС. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
nput: accounts = [["John","johnsmith@mail.com","john_newyork@mail.com"],["John","johnsmith@mail.com","john00@mail.com"],["Mary","mary@mail.com"],["John","johnnybravo@mail.com"]]
Output: [["John","john00@mail.com","john_newyork@mail.com","johnsmith@mail.com"],["Mary","mary@mail.com"],["John","johnnybravo@mail.com"]]
πŸ‘¨β€πŸ’» Алгоритм: 1⃣БоздайтС Π³Ρ€Π°Ρ„, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΡƒΠ·Π»Ρ‹ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ email-адрСса, Π° Ρ€Π΅Π±Ρ€Π° ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ email-адрСса, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Ρƒ. 2βƒ£ΠŸΡ€ΠΎΠΉΠ΄ΠΈΡ‚Π΅ ΠΏΠΎ Π³Ρ€Π°Ρ„Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ всС связанныС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½Π½Ρ‹Π΅ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Ρ‹. 3⃣Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ связанной ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, собСритС email-адрСса, отсортируйтС ΠΈΡ… ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² Π½Π°Ρ‡Π°Π»ΠΎ списка. 😎 РСшСниС:
#include <iostream>
#include <vector>
#include <unordered_map>
#include <unordered_set>
#include <stack>
#include <algorithm>

using namespace std;

vector<vector<string>> accountsMerge(vector<vector<string>>& accounts) {
    unordered_map<string, string> emailToName;
    unordered_map<string, unordered_set<string>> graph;

    
    for (auto& account : accounts) {
        string name = account[0];
        string firstEmail = account[1];
        for (int i = 1; i < account.size(); ++i) {
            string email = account[i];
            graph[firstEmail].insert(email);
            graph[email].insert(firstEmail);
            emailToName[email] = name;
        }
    }

    unordered_set<string> seen;
    vector<vector<string>> mergedAccounts;

   
    for (auto& [email, _] : emailToName) {
        if (seen.count(email) == 0) {
            vector<string> emails;
            stack<string> stk;
            stk.push(email);

            while (!stk.empty()) {
                string node = stk.top();
                stk.pop();
                if (seen.count(node) == 0) {
                    seen.insert(node);
                    emails.push_back(node);
                    for (auto& neighbor : graph[node]) {
                        if (!seen.count(neighbor)) {
                            stk.push(neighbor);
                        }
                    }
                }
            }

            sort(emails.begin(), emails.end());
            vector<string> account;
            account.push_back(emailToName[email]);
            account.insert(account.end(), emails.begin(), emails.end());
            mergedAccounts.push_back(account);
        }
    }

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

Π—Π°Π΄Π°Ρ‡Π°: 958. Check Completeness of a Binary Tree Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ ΠΊΠΎΡ€Π΅Π½ΡŒ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π°, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅, являСтся Π»ΠΈ ΠΎΠ½ΠΎ ΠΏΠΎΠ»Π½Ρ‹ΠΌ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌ Π΄Π΅Ρ€Π΅Π²ΠΎΠΌ. Π’ ΠΏΠΎΠ»Π½ΠΎΠΌ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΌ Π΄Π΅Ρ€Π΅Π²Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, послСднСго, ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½, ΠΈ всС ΡƒΠ·Π»Ρ‹ Π½Π° послСднСм ΡƒΡ€ΠΎΠ²Π½Π΅ располоТСны ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π²Π΅Π΅. На послСднСм ΡƒΡ€ΠΎΠ²Π½Π΅ h ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ 1 Π΄ΠΎ 2^h ΡƒΠ·Π»ΠΎΠ² Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: root = [1,2,3,4,5,6]
Output: true
Explanation: Every level before the last is full (ie. levels with node-values {1} and {2, 3}), and all nodes in the last level ({4, 5, 6}) are as far left as possible.
πŸ‘¨β€πŸ’» Алгоритм: 1⃣Если ΠΊΠΎΡ€Π΅Π½ΡŒ Π΄Π΅Ρ€Π΅Π²Π° Ρ€Π°Π²Π΅Π½ null, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ true. 2βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ nullNodeFound ΠΊΠ°ΠΊ false для отслСТивания Ρ‚ΠΎΠ³ΠΎ, встрСчался Π»ΠΈ ΡƒΠΆΠ΅ null-ΡƒΠ·Π΅Π». Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΈ помСститС Π² Π½Π΅Ρ‘ ΠΊΠΎΡ€Π΅Π½ΡŒ Π΄Π΅Ρ€Π΅Π²Π°. 3βƒ£ΠŸΠΎΠΊΠ° ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π½Π΅ пуста: Π˜Π·Π²Π»Π΅ΠΊΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. Если элСмСнт Ρ€Π°Π²Π΅Π½ null, установитС nullNodeFound Π² true. Если элСмСнт Π½Π΅ Ρ€Π°Π²Π΅Π½ null, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, встрСчался Π»ΠΈ ΡƒΠΆΠ΅ null-ΡƒΠ·Π΅Π». Если nullNodeFound Ρ€Π°Π²Π΅Π½ true, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ false. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π»Π΅Π²ΠΎΠ³ΠΎ ΠΈ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΡƒΠ·Π»Π°. 😎 РСшСниС:
class Solution {
public:
    bool isCompleteTree(TreeNode* root) {
        if (!root) return true;

        queue<TreeNode*> q;
        q.push(root);
        bool nullNodeFound = false;

        while (!q.empty()) {
            TreeNode* node = q.front();
            q.pop();

            if (!node) {
                nullNodeFound = true;
            } else {
                if (nullNodeFound) {
                    return false;
                }
                q.push(node->left);
                q.push(node->right);
            }
        }
        return true;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 587. Erect the Fence Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: hard Π’Π°ΠΌ Π΄Π°Π½ массив trees, Π³Π΄Π΅ trees[i] = [xi, yi] прСдставляСт мСстополоТСниС Π΄Π΅Ρ€Π΅Π²Π°
Π—Π°Π΄Π°Ρ‡Π°: 587. Erect the Fence Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: hard Π’Π°ΠΌ Π΄Π°Π½ массив trees, Π³Π΄Π΅ trees[i] = [xi, yi] прСдставляСт мСстополоТСниС Π΄Π΅Ρ€Π΅Π²Π° Π² саду. ΠžΠ³Ρ€Π°Π΄ΠΈΡ‚Π΅ вСсь сад с использованиСм минимальной Π΄Π»ΠΈΠ½Ρ‹ Π²Π΅Ρ€Π΅Π²ΠΊΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это Π΄ΠΎΡ€ΠΎΠ³ΠΎ. Π‘Π°Π΄ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΎΠ³ΠΎΡ€ΠΎΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли всС Π΄Π΅Ρ€Π΅Π²ΡŒΡ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½Ρ‹. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ находятся Ρ‚ΠΎΡ‡Π½ΠΎ Π½Π° ΠΏΠ΅Ρ€ΠΈΠΌΠ΅Ρ‚Ρ€Π΅ ΠΎΠ³Ρ€Π°Π΄Ρ‹. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚ Π² любом порядкС. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: trees = [[1,1],[2,2],[2,0],[2,4],[3,3],[4,2]]
Output: [[1,1],[2,0],[4,2],[3,3],[2,4]]
Explanation: All the trees will be on the perimeter of the fence except the tree at [2, 2], which will be inside the fence.
πŸ‘¨β€πŸ’» Алгоритм: 1⃣ Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΈ построСниС Π½ΠΈΠΆΠ½Π΅ΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ: ΠžΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΏΠΎ ΠΈΡ… x-ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌ, Π° Π² случаС совпадСния x-ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚, ΠΏΠΎ y-ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌ. ΠŸΠΎΡΡ‚Ρ€ΠΎΠΉΡ‚Π΅ ниТнюю ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ, добавляя Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΊ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅ ΠΈ удаляя послСдниС Ρ‚ΠΎΡ‡ΠΊΠΈ, Ссли ΠΎΠ½ΠΈ Π½Π΅ ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ ΠΏΡ€ΠΎΡ‚ΠΈΠ² часовой стрСлки ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚. 2⃣ ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ: ΠŸΡ€ΠΎΠΉΠ΄ΠΈΡ‚Π΅ΡΡŒ ΠΏΠΎ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π²Π΅Ρ€Ρ…Π½ΡŽΡŽ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ. ДобавляйтС Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΊ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅ ΠΈ удаляйтС послСдниС Ρ‚ΠΎΡ‡ΠΊΠΈ, Ссли ΠΎΠ½ΠΈ Π½Π΅ ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ ΠΏΡ€ΠΎΡ‚ΠΈΠ² часовой стрСлки ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚. 3⃣ Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… элСмСнтов ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ HashSet, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π΄ΡƒΠ±Π»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ΡΡ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΈΠ· стСка. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠΉΡ‚Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² массив ΠΈ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ Π΅Π³ΠΎ. 😎 РСшСниС:
class Solution {
public:
    int orientation(vector<int>& p, vector<int>& q, vector<int>& r) {
        return (q[1] - p[1]) * (r[0] - q[0]) - (q[0] - p[0]) * (r[1] - q[1]);
    }

    vector<vector<int>> outerTrees(vector<vector<int>>& points) {
        sort(points.begin(), points.end(), [](vector<int>& p, vector<int>& q) {
            return p[0] == q[0] ? p[1] < q[1] : p[0] < q[0];
        });

        vector<vector<int>> hull;

        for (auto& point : points) {
            while (hull.size() >= 2 && orientation(hull[hull.size() - 2], hull.back(), point) > 0)
                hull.pop_back();
            hull.push_back(point);
        }

        hull.pop_back();

        for (int i = points.size() - 1; i >= 0; --i) {
            while (hull.size() >= 2 && orientation(hull[hull.size() - 2], hull.back(), points[i]) > 0)
                hull.pop_back();
            hull.push_back(points[i]);
        }

        set<vector<int>> s(hull.begin(), hull.end());
        return vector<vector<int>>(s.begin(), s.end());
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 364. Nested List Weight Sum II Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π’Π°ΠΌ Π΄Π°Π½ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ список Ρ†Π΅Π»Ρ‹Ρ… чисСл nestedList. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт явля
Π—Π°Π΄Π°Ρ‡Π°: 364. Nested List Weight Sum II Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π’Π°ΠΌ Π΄Π°Π½ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ список Ρ†Π΅Π»Ρ‹Ρ… чисСл nestedList. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт являСтся Π»ΠΈΠ±ΠΎ Ρ†Π΅Π»Ρ‹ΠΌ числом, Π»ΠΈΠ±ΠΎ списком, элСмСнты ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ†Π΅Π»Ρ‹ΠΌΠΈ числами ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ списками. Π“Π»ΡƒΠ±ΠΈΠ½Π° Ρ†Π΅Π»ΠΎΠ³ΠΎ числа β€” это количСство списков, Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ΠΎ находится. НапримСр, Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ список [1,[2,2],[[3],2],1] ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ†Π΅Π»ΠΎΠ³ΠΎ числа, установлСнноС Ρ€Π°Π²Π½Ρ‹ΠΌ Π΅Π³ΠΎ Π³Π»ΡƒΠ±ΠΈΠ½Π΅. ΠŸΡƒΡΡ‚ΡŒ maxDepth Π±ΡƒΠ΄Π΅Ρ‚ максимальной Π³Π»ΡƒΠ±ΠΈΠ½ΠΎΠΉ любого Ρ†Π΅Π»ΠΎΠ³ΠΎ числа. ВСс Ρ†Π΅Π»ΠΎΠ³ΠΎ числа опрСдСляСтся ΠΊΠ°ΠΊ maxDepth - (Π³Π»ΡƒΠ±ΠΈΠ½Π° Ρ†Π΅Π»ΠΎΠ³ΠΎ числа) + 1. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ сумму ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ†Π΅Π»ΠΎΠ³ΠΎ числа Π² nestedList, ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½Π½ΡƒΡŽ Π½Π° Π΅Π³ΠΎ вСс. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: nestedList = [[1,1],2,[1,1]]
Output: 8
Explanation: Four 1's with a weight of 1, one 2 with a weight of 2.
1*1 + 1*1 + 2*2 + 1*1 + 1*1 = 8
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ BFS-Π΄Π΅Ρ€Π΅Π²Π°, Π΄ΠΎΠ±Π°Π²ΠΈΠ² всС элСмСнты ΠΈΠ· Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ nestedList Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ. 2⃣Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ уровня ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π½ΠΈΠΉ элСмСнт ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. Если это список, Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ элСмСнты Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ значСния sumOfElements, maxDepth ΠΈ sumOfProducts. 3βƒ£ΠšΠΎΠ³Π΄Π° ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ станСт пустой, Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (maxDepth + 1) * sumOfElements - sumOfProducts. 😎 РСшСниС:
#include <vector>
#include <queue>
using namespace std;

class NestedInteger {
public:
    bool isInteger() const;
    int getInteger() const;
    const vector<NestedInteger> &getList() const;
};

class Solution {
public:
    int depthSumInverse(vector<NestedInteger>& nestedList) {
        queue<NestedInteger> q;
        for (auto& ni : nestedList) q.push(ni);

        int depth = 1, maxDepth = 0, sumOfElements = 0, sumOfProducts = 0;

        while (!q.empty()) {
            int size = q.size();
            maxDepth = max(maxDepth, depth);

            for (int i = 0; i < size; ++i) {
                NestedInteger nested = q.front();
                q.pop();

                if (nested.isInteger()) {
                    int value = nested.getInteger();
                    sumOfElements += value;
                    sumOfProducts += value * depth;
                } else {
                    for (auto& ni : nested.getList()) q.push(ni);
                }
            }
            depth++;
        }
        return (maxDepth + 1) * sumOfElements - sumOfProducts;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 1260. Shift 2D Grid Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: easy Π”Π°Π½Π° двумСрная сСтка Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ m x n ΠΈ Ρ†Π΅Π»ΠΎΠ΅ число k. ВрСбуСтся ΡΠ΄Π²ΠΈΠ½ΡƒΡ‚ΡŒ сСтку k Ρ€Π°Π·. Π—Π° ΠΎΠ΄Π½Ρƒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ сдвига: элСмСнт Π² grid[i][j] пСрСмСщаСтся Π² grid[i][j + 1]. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ Π² grid[i][n - 1] пСрСмСщаСтся Π² grid[i + 1][0]. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ Π² grid[m - 1][n - 1] пСрСмСщаСтся Π² grid[0][0]. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΡƒΡŽ сСтку послС примСнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ сдвига k Ρ€Π°Π·. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: grid = [[1,2,3],[4,5,6],[7,8,9]], k = 1
Output: [[9,1,2],[3,4,5],[6,7,8]]
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΡƒΡŽ сСтку Π² ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив. 2βƒ£Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ сдвиг элСмСнтов Π² ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎΠΌ массивС. 3βƒ£ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΡƒΡŽ сСтку. 😎 РСшСниС:
class Solution {
public:
    vector<vector<int>> shiftGrid(vector<vector<int>>& grid, int k) {
        int m = grid.size(), n = grid[0].size();
        int total = m * n;
        k = k % total;

        if (k == 0) {
            return grid;
        }

        vector<int> flatArray(total);
        for (int i = 0; i < total; ++i) {
            flatArray[i] = grid[i / n][i % n];
        }

        vector<int> newArray(total);
        for (int i = 0; i < total; ++i) {
            newArray[(i + k) % total] = flatArray[i];
        }

        vector<vector<int>> newGrid(m, vector<int>(n));
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                newGrid[i][j] = newArray[i * n + j];
            }
        }

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

Π—Π°Π΄Π°Ρ‡Π°: 473. Matchsticks to Square Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ΠΎ цСлочислСнный массив спичСк, Π³Π΄Π΅ matchsticks[i] β€” это Π΄Π»ΠΈΠ½Π° i-ΠΉ спи
Π—Π°Π΄Π°Ρ‡Π°: 473. Matchsticks to Square Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ΠΎ цСлочислСнный массив спичСк, Π³Π΄Π΅ matchsticks[i] β€” это Π΄Π»ΠΈΠ½Π° i-ΠΉ спички. НСобходимо ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС спички для создания ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°. НСльзя Π»ΠΎΠΌΠ°Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΡƒΡŽ спичку, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒ ΠΈΡ…, ΠΏΡ€ΠΈ этом каТдая спичка Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ использована Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒ true, Ссли ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚, ΠΈ false Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: matchsticks = [1,1,2,2,2]
Output: true
Explanation: You can form a square with length 2, one side of the square came two sticks with length 1.
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ индСкс ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ спички ΠΈ количСство сторон ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΆΠ΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ сформированы. Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ случай для рСкурсии: Ссли всС спички ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΈ сформировано 4 стороны, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ True. 2⃣Для Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ спички рассматриваСм 4 Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°: ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒΡŽ любой ΠΈΠ· сторон ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π°. ΠŸΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· 4 Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ², вызывая Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ для Π½ΠΈΡ…. 3⃣Если ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΈΠ· рСкурсивных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ True, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ True, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ False. 😎 РСшСниС:
#include <vector>
#include <algorithm>

class Solution {
public:
    std::vector<int> nums;
    std::vector<int> sums;
    int possibleSquareSide;

    Solution() : sums(4, 0) {}

    bool dfs(int index) {
        if (index == nums.size()) {
            return sums[0] == sums[1] && sums[1] == sums[2] && sums[2] == sums[3];
        }

        int element = nums[index];

        for (int i = 0; i < 4; ++i) {
            if (sums[i] + element <= possibleSquareSide) {
                sums[i] += element;
                if (dfs(index + 1)) {
                    return true;
                }
                sums[i] -= element;
            }
        }

        return false;
    }

    bool makesquare(std::vector<int>& nums) {
        if (nums.empty()) {
            return false;
        }

        int perimeter = std::accumulate(nums.begin(), nums.end(), 0);
        possibleSquareSide = perimeter / 4;
        if (possibleSquareSide * 4 != perimeter) {
            return false;
        }

        std::sort(nums.rbegin(), nums.rend());
        this->nums = nums;
        return dfs(0);
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 903. Valid Permutations for DI Sequence Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: hard Π’Π°ΠΌ Π΄Π°Π½Π° строка s Π΄Π»ΠΈΠ½Ρ‹ n, Π³Π΄Π΅ s[i] Π»ΠΈΠ±ΠΎ: 'D' ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΡƒΠ±Ρ‹Π²Π°Π½ΠΈΠ΅, Π»ΠΈΠ±ΠΎ 'I' ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ возрастаниС. ΠŸΠ΅Ρ€Π΅ΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° perm ΠΈΠ· n + 1 Ρ†Π΅Π»Ρ‹Ρ… чисСл всСх Ρ†Π΅Π»Ρ‹Ρ… чисСл Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ [0, n] называСтся допустимой, Ссли для всСх допустимых i: Ссли s[i] == 'D', Ρ‚ΠΎ perm[i] > perm[i + 1], Π° Ссли s[i] == 'I', Ρ‚ΠΎ perm[i] < perm[i + 1]. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ количСство допустимых пСрСстановок perm. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΡ‚Π²Π΅Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ большим, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ Π΅Π³ΠΎ ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ 109 + 7. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: s = "DID"
Output: 5
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив dp, Π³Π΄Π΅ dp[i][j] прСдставляСт количСство допустимых пСрСстановок Π΄Π»ΠΈΠ½Ρ‹ i, ΠΎΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΡ…ΡΡ Π½Π° j. 2βƒ£Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ массив dp, учитывая условия возрастания ΠΈ убывания ΠΈΠ· строки s. 3βƒ£Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒ сумму dp[n][j] для всСх j, Ρ‡Ρ‚ΠΎ даст количСство допустимых пСрСстановок Π΄Π»ΠΈΠ½Ρ‹ n + 1. 😎 РСшСниС:
class Solution {
public:
    int numPermsDISequence(string s) {
        const int MOD = 1e9 + 7;
        int n = s.size();
        vector<vector<int>> dp(n + 1, vector<int>(n + 1, 0));
        dp[0][0] = 1;
        
        for (int i = 1; i <= n; i++) {
            for (int j = 0; j <= i; j++) {
                if (s[i - 1] == 'D') {
                    for (int k = j; k < i; k++) {
                        dp[i][j] = (dp[i][j] + dp[i - 1][k]) % MOD;
                    }
                } else {
                    for (int k = 0; k < j; k++) {
                        dp[i][j] = (dp[i][j] + dp[i - 1][k]) % MOD;
                    }
                }
            }
        }
        
        int result = 0;
        for (int j = 0; j <= n; j++) {
            result = (result + dp[n][j]) % MOD;
        }
        
        return result;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 814. Binary Tree Pruning Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ ΠΊΠΎΡ€Π΅Π½ΡŒ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π°. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ Ρ‚ΠΎ ΠΆΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ всС ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΡŒΡ (Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π°), Π½Π΅ содСрТащиС 1. ΠŸΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ ΡƒΠ·Π»Π° node - это сам ΡƒΠ·Π΅Π» node ΠΈ всС ΡƒΠ·Π»Ρ‹, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°ΠΌΠΈ node. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: root = [1,null,0,0,1]
Output: [1,null,0,null,1]
Explanation: 
Only the red nodes satisfy the property "every subtree not containing a 1".
The diagram on the right represents the answer.
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ containsOne(node), которая сообщаСт, содСрТит Π»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡƒΠ·Π»Π΅ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ, ΠΈ ΠΎΠ±Ρ€Π΅Π·Π°Π΅Ρ‚ всС ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΡŒΡ, Π½Π΅ содСрТащиС Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ. 2⃣НапримСр, Ссли ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ node.left Π½Π΅ содСрТит Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ, Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±Ρ€Π΅Π·Π°Ρ‚ΡŒ Π΅Π³ΠΎ Ρ‡Π΅Ρ€Π΅Π· node.left = null. 3⃣ВакТС Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΡƒΠ·Π΅Π». НапримСр, Ссли Π΄Π΅Ρ€Π΅Π²ΠΎ состоит ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° 0, Ρ‚ΠΎ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ пустоС Π΄Π΅Ρ€Π΅Π²ΠΎ. 😎 РСшСниС:
class Solution {
public:
    TreeNode* pruneTree(TreeNode* root) {
        return containsOne(root) ? root : nullptr;
    }

private:
    bool containsOne(TreeNode* node) {
        if (!node) return false;

        bool leftContainsOne = containsOne(node->left);
        bool rightContainsOne = containsOne(node->right);

        if (!leftContainsOne) node->left = nullptr;
        if (!rightContainsOne) node->right = nullptr;

        return node->val == 1 || leftContainsOne || rightContainsOne;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 404. Sum of Left Leaves Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: easy Если Π·Π°Π΄Π°Π½ ΠΊΠΎΡ€Π΅Π½ΡŒ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π°, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ сумму всСх Π»Π΅Π²Ρ‹Ρ… Π»ΠΈΡΡ‚ΡŒΠ΅Π². Лист -
Π—Π°Π΄Π°Ρ‡Π°: 404. Sum of Left Leaves Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: easy Если Π·Π°Π΄Π°Π½ ΠΊΠΎΡ€Π΅Π½ΡŒ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π°, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ сумму всСх Π»Π΅Π²Ρ‹Ρ… Π»ΠΈΡΡ‚ΡŒΠ΅Π². Лист - это ΡƒΠ·Π΅Π», Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ Π΄Π΅Ρ‚Π΅ΠΉ. Π›Π΅Π²Ρ‹ΠΉ лист - это лист, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся Π»Π΅Π²Ρ‹ΠΌ Ρ€Π΅Π±Π΅Π½ΠΊΠΎΠΌ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΡƒΠ·Π»Π°. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: root = [3,9,20,null,null,15,7]
Output: 24
πŸ‘¨β€πŸ’» Алгоритм: 1⃣РСкурсивный ΠΎΠ±Ρ…ΠΎΠ΄ Π΄Π΅Ρ€Π΅Π²Π° ΠžΠ±Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ Π΄Π΅Ρ€Π΅Π²ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ рСкурсивной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΡƒΠ·Π΅Π» ΠΈ Ρ„Π»Π°Π³, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ, являСтся Π»ΠΈ ΡƒΠ·Π΅Π» Π»Π΅Π²Ρ‹ΠΌ Ρ€Π΅Π±Π΅Π½ΠΊΠΎΠΌ. 2βƒ£ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π»ΠΈΡΡ‚ΡŒΠ΅Π² Если Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΡƒΠ·Π΅Π» являСтся листом ΠΈ Ρ„Π»Π°Π³ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ это Π»Π΅Π²Ρ‹ΠΉ Ρ€Π΅Π±Π΅Π½ΠΎΠΊ, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠ·Π»Π° ΠΊ суммС. 3⃣РСкурсивный Π²Ρ‹Π·ΠΎΠ² для Π΄Π΅Ρ‚Π΅ΠΉ РСкурсивно Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для Π»Π΅Π²ΠΎΠ³ΠΎ ΠΈ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ Π΄Π΅Ρ‚Π΅ΠΉ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΡƒΠ·Π»Π°, пСрСдавая ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Π»Π°Π³. 😎 РСшСниС:
class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) {
        return dfs(root, false);
    }
    
private:
    int dfs(TreeNode* node, bool isLeft) {
        if (!node) return 0;
        if (!node->left && !node->right) return isLeft ? node->val : 0;
        return dfs(node->left, true) + dfs(node->right, false);
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 336. Palindrome Pairs Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: hard Π’Π°ΠΌ Π΄Π°Π½ массив ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… строк words, индСксируСмый с 0. ΠŸΠ°Ρ€Π° ΠΏΠ°Π»ΠΈΠ½Π΄Ρ€ΠΎΠΌΠΎΠ² β€” это ΠΏΠ°Ρ€Π° Ρ†Π΅Π»Ρ‹Ρ… чисСл (i, j), Ρ‚Π°ΠΊΠΈΡ… Ρ‡Ρ‚ΠΎ: 0 <= i, j < words.length, i != j, ΠΈ words[i] + words[j] (конкатСнация Π΄Π²ΡƒΡ… строк) являСтся ΠΏΠ°Π»ΠΈΠ½Π΄Ρ€ΠΎΠΌΠΎΠΌ. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ массив всСх ΠΏΠ°Ρ€ ΠΏΠ°Π»ΠΈΠ½Π΄Ρ€ΠΎΠΌΠΎΠ² ΠΈΠ· слов. Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ с Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ O(сумма Π΄Π»ΠΈΠ½ всСх слов Π² words). ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: words = ["abcd","dcba","lls","s","sssll"]
Output: [[0,1],[1,0],[3,2],[2,4]]
Explanation: The palindromes are ["abcddcba","dcbaabcd","slls","llssssll"]
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…: Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ структуру для хранСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² (список ΠΏΠ°Ρ€ индСксов). Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ для хранСния слов ΠΈ ΠΈΡ… индСксов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ поиск. 2βƒ£Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΡ ΠΏΠΎ всСм ΠΏΠ°Ρ€Π°ΠΌ слов ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°: ΠŸΡ€ΠΎΠΉΠ΄ΠΈΡ‚Π΅ ΠΏΠΎ всСм ΠΏΠ°Ρ€Π°ΠΌ слов Π² массивС words, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΄Π²Π° Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ†ΠΈΠΊΠ»Π°. Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ°Ρ€Ρ‹ слов провСряйтС, ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ Π»ΠΈ ΠΎΠ½ΠΈ ΠΏΠ°Π»ΠΈΠ½Π΄Ρ€ΠΎΠΌ ΠΏΡ€ΠΈ ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ. Π­Ρ‚ΠΎ дСлаСтся ΠΏΡƒΡ‚Π΅ΠΌ объСдинСния строк ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, Ρ€Π°Π²Π½Π° Π»ΠΈ объСдинСнная строка своСй ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ вСрсии. 3⃣ДобавлСниС Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… ΠΏΠ°Ρ€ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: Если ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΠΏΠ°Π»ΠΈΠ½Π΄Ρ€ΠΎΠΌ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΏΠ°Ρ€Ρƒ индСксов Π² список Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ список всСх Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… ΠΏΠ°Ρ€. 😎 РСшСниС:
class Solution {
public:
    vector<vector<int>> palindromePairs(vector<string>& words) {
        vector<vector<int>> pairs;
        
        for (int i = 0; i < words.size(); ++i) {
            for (int j = 0; j < words.size(); ++j) {
                if (i == j) continue;
                string combined = words[i] + words[j];
                string reversed = string(combined.rbegin(), combined.rend());
                if (combined == reversed) {
                    pairs.push_back({i, j});
                }
            }
        }
        
        return pairs;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 1057. Campus Bikes Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π’ Π³ΠΎΡ€ΠΎΠ΄ΠΊΠ΅, ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π½ΠΎΠΌ Π½Π° плоскости X-Y, Π΅ΡΡ‚ΡŒ n Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… ΠΈ m вСлосипСдов, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ n <= m. Π’Π°ΠΌ Π΄Π°Π½ массив workers Π΄Π»ΠΈΠ½Ρ‹ n, Π³Π΄Π΅ workers[i] = [xi, yi] - ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ i-Π³ΠΎ Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ. Π’Π°ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ Π΄Π°Π½ массив bikes Π΄Π»ΠΈΠ½Ρ‹ m, Π³Π΄Π΅ bikes[j] = [xj, yj] - позиция j-Π³ΠΎ вСлосипСда. ВсС Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹. НазначаСм вСлосипСд ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΠΊΡƒ. Π‘Ρ€Π΅Π΄ΠΈ доступных вСлосипСдов ΠΈ Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΠΊΠΎΠ² ΠΌΡ‹ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ ΠΏΠ°Ρ€Ρƒ (workeri, bikej) с наимСньшим манхэттСнским расстояниСм ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ ΠΈ Π½Π°Π·Π½Π°Ρ‡Π°Π΅ΠΌ вСлосипСд этому Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΠΊΡƒ. Если сущСствуСт нСсколько ΠΏΠ°Ρ€ (workeri, bikej) с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ наимСньшим манхэттСнским расстояниСм, ΠΌΡ‹ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ ΠΏΠ°Ρ€Ρƒ с наимСньшим индСксом Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΠΊΠ°. Если сущСствуСт нСсколько способов ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это, ΠΌΡ‹ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ ΠΏΠ°Ρ€Ρƒ с наимСньшим индСксом вСлосипСда. ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΡΠ΅ΠΌ этот процСсс Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ останСтся свободных Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΠΊΠΎΠ². Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ массив answer Π΄Π»ΠΈΠ½Ρ‹ n, Π³Π΄Π΅ answer[i] - индСкс (с индСксом 0) вСлосипСда, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ i-ΠΉ Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΠΊ. ΠœΠ°Π½Ρ…ΡΡ‚Ρ‚Π΅Π½ΡΠΊΠΎΠ΅ расстояниС ΠΌΠ΅ΠΆΠ΄Ρƒ двумя Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ p1 ΠΈ p2 Ρ€Π°Π²Π½ΠΎ Manhattan(p1, p2) = |p1.x - p2.x| + |p1.y - p2.y|. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: workers = [[0,0],[2,1]], bikes = [[1,2],[3,3]]
Output: [1,0]
πŸ‘¨β€πŸ’» Алгоритм: 1⃣Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ°Ρ€Ρ‹ (Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΠΊ, вСлосипСд) вычисли ΠœΠ°Π½Ρ…ΡΡ‚Ρ‚Π΅Π½ΡΠΊΠΎΠ΅ расстояниС ΠΈ сохрани всС ΠΏΠ°Ρ€Ρ‹ вмСстС с расстояниСм Π² список. 2βƒ£ΠžΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉ список ΠΏΠ°Ρ€ ΠΏΠΎ Ρ€Π°ΡΡΡ‚ΠΎΡΠ½ΠΈΡŽ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠΎ индСксу Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΠΊΠ° ΠΈ вСлосипСда. ΠΠ°Π·Π½Π°Ρ‡ΡŒ вСлосипСды Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΠΊΠ°ΠΌ, слСдуя отсортированному списку ΠΏΠ°Ρ€ ΠΈ отслСТивая, ΠΊΠ°ΠΊΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΠΊΠΈ ΠΈ вСлосипСды ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹. 3⃣Заполни ΠΈ Π²Π΅Ρ€Π½ΠΈ массив Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. 😎 РСшСниС:
class Solution {
public:
    vector<int> assignBikes(vector<vector<int>>& workers, vector<vector<int>>& bikes) {
        vector<tuple<int, int, int>> pairs;
        
        for (int i = 0; i < workers.size(); i++) {
            for (int j = 0; j < bikes.size(); j++) {
                int distance = abs(workers[i][0] - bikes[j][0]) + abs(workers[i][1] - bikes[j][1]);
                pairs.emplace_back(distance, i, j);
            }
        }
        
        sort(pairs.begin(), pairs.end());
        
        vector<int> result(workers.size(), -1);
        vector<bool> bikeTaken(bikes.size(), false);
        vector<bool> workerAssigned(workers.size(), false);
        
        for (auto& [distance, workerIdx, bikeIdx] : pairs) {
            if (!workerAssigned[workerIdx] && !bikeTaken[bikeIdx]) {
                result[workerIdx] = bikeIdx;
                bikeTaken[bikeIdx] = true;
                workerAssigned[workerIdx] = true;
            }
        }
        
        return result;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 208. Implement Trie (Prefix Tree) Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ структуру Π΄Π°Π½Π½Ρ‹Ρ… Trie (прСфиксноС Π΄Π΅Ρ€Π΅Π²ΠΎ), ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΡƒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ: insert(word) β€” вставка слова search(word) β€” ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°, Π±Ρ‹Π»ΠΎ Π»ΠΈ слово вставлСно startsWith(prefix) β€” ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°, начинаСтся Π»ΠΈ Ρ…ΠΎΡ‚ΡŒ ΠΎΠ΄Π½ΠΎ вставлСнноС слово с Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ прСфикса ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: ["Trie", "insert", "search", "search", "startsWith", "insert", "search"]
[[], ["apple"], ["apple"], ["app"], ["app"], ["app"], ["app"]]
Output: [null, null, true, false, true, null, true]
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΈ вставка: ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΠ·Π΅Π» (TrieNode) содСрТит массив ΠΈΠ· 26 ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ (ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ Π½Π° ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π±ΡƒΠΊΠ²Ρƒ Π°Π»Ρ„Π°Π²ΠΈΡ‚Π°) ΠΈ Ρ„Π»Π°Π³ isEnd. ΠœΠ΅Ρ‚ΠΎΠ΄ insert создаСт Π½Π΅Π΄ΠΎΡΡ‚Π°ΡŽΡ‰ΠΈΠ΅ ΡƒΠ·Π»Ρ‹ ΠΈ Π² ΠΊΠΎΠ½Ρ†Π΅ устанавливаСт isEnd = true для послСднСго символа слова. 2βƒ£ΠŸΠΎΠΈΡΠΊ строки: ΠœΠ΅Ρ‚ΠΎΠ΄ search ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ searchPrefix, которая ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎ всСм символам слова. Если Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹ΠΉ ΡƒΠ·Π΅Π» сущСствуСт ΠΈ ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½ ΠΊΠ°ΠΊ ΠΊΠΎΠ½Π΅Ρ† слова, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ true. 3βƒ£ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° прСфикса: ΠœΠ΅Ρ‚ΠΎΠ΄ startsWith ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ searchPrefix, ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, Ссли ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π΄ΠΎΠΉΡ‚ΠΈ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ прСфикса. 😎 РСшСниС:
#include <vector>
#include <string>

class TrieNode {
private:
    TrieNode* links[26];
    bool isEnd;

public:
    TrieNode() : isEnd(false) {
        for (int i = 0; i < 26; ++i) {
            links[i] = nullptr;
        }
    }

    bool containsKey(char ch) {
        return links[ch - 'a'] != nullptr;
    }

    TrieNode* get(char ch) {
        return links[ch - 'a'];
    }

    void put(char ch, TrieNode* node) {
        links[ch - 'a'] = node;
    }

    void setEnd() {
        isEnd = true;
    }

    bool isEndNode() {
        return isEnd;
    }
};

class Trie {
private:
    TrieNode* root;

    TrieNode* searchPrefix(const std::string& word) {
        TrieNode* node = root;
        for (char ch : word) {
            if (node->containsKey(ch)) {
                node = node->get(ch);
            } else {
                return nullptr;
            }
        }
        return node;
    }

public:
    Trie() {
        root = new TrieNode();
    }

    void insert(const std::string& word) {
        TrieNode* node = root;
        for (char ch : word) {
            if (!node->containsKey(ch)) {
                node->put(ch, new TrieNode());
            }
            node = node->get(ch);
        }
        node->setEnd();
    }

    bool search(const std::string& word) {
        TrieNode* node = searchPrefix(word);
        return node != nullptr && node->isEndNode();
    }

    bool startsWith(const std::string& prefix) {
        return searchPrefix(prefix) != nullptr;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ