uz
Feedback
C/C++ | LeetCode

C/C++ | LeetCode

Kanalga Telegram’da oβ€˜tish

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

Ko'proq ko'rsatish
3 239
Obunachilar
+124 soatlar
+77 kunlar
-430 kunlar
Postlar arxiv
Π—Π°Π΄Π°Ρ‡Π°: 1365. How Many Numbers Are Smaller Than the Current Number Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: easy Π”Π°Π½ массив nums. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта nums[i] ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅, сколько чисСл Π² массивС мСньшС Π΅Π³ΠΎ. Π’ΠΎ Π΅ΡΡ‚ΡŒ, для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ nums[i] Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ количСство допустимых j, Ρ‚Π°ΠΊΠΈΡ… Ρ‡Ρ‚ΠΎ j != i ΠΈ nums[j] < nums[i]. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ ΠΎΡ‚Π²Π΅Ρ‚ Π² Π²ΠΈΠ΄Π΅ массива. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: nums = [6,5,4,8]
Output: [2,1,0,3]
πŸ‘¨β€πŸ’» Алгоритм: 1⃣БозданиС ΠΊΠΎΠΏΠΈΠΈ ΠΈ сортировка массива: Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ копию массива nums, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π»Π΅Π³ΠΊΠΎ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ количСство элСмСнтов, ΠΌΠ΅Π½ΡŒΡˆΠΈΡ… Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ. 2βƒ£ΠŸΠΎΠΈΡΠΊ индСкса ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта: Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта nums[i] Π½Π°ΠΉΠ΄ΠΈΡ‚Π΅ Π΅Π³ΠΎ индСкс Π² отсортированной ΠΊΠΎΠΏΠΈΠΈ массива. Π­Ρ‚ΠΎΡ‚ индСкс ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ количСство элСмСнтов, ΠΌΠ΅Π½ΡŒΡˆΠΈΡ… nums[i]. 3⃣ЀормированиС ΠΎΡ‚Π²Π΅Ρ‚Π°: Π‘Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠΉΡ‚Π΅ массив ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ², Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ количСству чисСл, ΠΌΠ΅Π½ΡŒΡˆΠΈΡ… Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ. 😎 РСшСниС:
#include <vector>
#include <algorithm>

class Solution {
public:
    std::vector<int> smallerNumbersThanCurrent(std::vector<int>& nums) {
        std::vector<int> sortedNums = nums;
        std::sort(sortedNums.begin(), sortedNums.end());
        std::vector<int> result;
        
        for (int num : nums) {
            result.push_back(std::find(sortedNums.begin(), sortedNums.end(), num) - sortedNums.begin());
        }
        
        return result;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 45. Jump Game II Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ массив nums, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт nums[i] ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ ΠΏΡ€Ρ‹ΠΆΠΊΠ° ΠΈ
Π—Π°Π΄Π°Ρ‡Π°: 45. Jump Game II Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ массив nums, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт nums[i] ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ ΠΏΡ€Ρ‹ΠΆΠΊΠ° ΠΈΠ· ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ i. НСобходимо Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ минимальноС количСство ΠΏΡ€Ρ‹ΠΆΠΊΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ послСднСго индСкса. ГарантируСтся, Ρ‡Ρ‚ΠΎ это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: nums = [2,3,0,1,4] Output: 2
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ: curEnd = 0 β€” Π³Ρ€Π°Π½ΠΈΡ†Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€Ρ‹ΠΆΠΊΠ° curFar = 0 β€” самая дальняя достиТимая позиция answer = 0 β€” количСство ΠΏΡ€Ρ‹ΠΆΠΊΠΎΠ² 2βƒ£ΠŸΠ΅Ρ€Π΅Π±Ρ€Π°Ρ‚ΡŒ массив Π΄ΠΎ прСдпослСднСго индСкса: На ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ curFar = max(curFar, i + nums[i]) 3βƒ£ΠšΠΎΠ³Π΄Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ индСкс достигаСт curEnd, ΡΠΎΠ²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€Ρ‹ΠΆΠΎΠΊ: Π£Π²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ answer++ ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ curEnd = curFar 😎 РСшСниС:
class Solution {
public:
    int jump(vector<int>& nums) {
        int answer = 0, n = int(nums.size());
        int curEnd = 0, curFar = 0;

        for (int i = 0; i < n - 1; ++i) {
            curFar = max(curFar, i + nums[i]);
            if (i == curEnd) {
                answer++;
                curEnd = curFar;
            }
        }
        return answer;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 1039. Minimum Score Triangulation of Polygon Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π£ вас Π΅ΡΡ‚ΡŒ Π²Ρ‹ΠΏΡƒΠΊΠ»Ρ‹ΠΉ n-сторонний ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ, каТдая Π²Π΅Ρ€ΡˆΠΈΠ½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ цСлочислСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’Π°ΠΌ Π΄Π°Π½ цСлочислСнный массив values, Π³Π΄Π΅ values[i] - это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ i-ΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ (Ρ‚.Π΅. ΠΏΠΎ часовой стрСлкС). Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ‚Ρ€ΠΈΠ°Π½Π³ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ Π½Π° n - 2 Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° Ρ€Π°Π²Π½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡŽ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π΅Π³ΠΎ Π²Π΅Ρ€ΡˆΠΈΠ½, Π° ΠΎΠ±Ρ‰ΠΈΠΉ Π±Π°Π»Π» триангуляции Ρ€Π°Π²Π΅Π½ суммС этих Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ для всСх n - 2 Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ² Π² триангуляции. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ наимСньший Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ ΠΎΠ±Ρ‰ΠΈΠΉ Π±Π°Π»Π», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ триангуляции ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: values = [1,2,3]
Output: 6
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ: Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив dp, Π³Π΄Π΅ dp[i][j] Π±ΡƒΠ΄Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ ΠΎΠ±Ρ‰ΠΈΠΉ Π±Π°Π»Π» триангуляции ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°, состоящСго ΠΈΠ· Π²Π΅Ρ€ΡˆΠΈΠ½ ΠΎΡ‚ i Π΄ΠΎ j. 2βƒ£ΠžΡΠ½ΠΎΠ²Π½ΠΎΠ΅ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ dp: ΠŸΡ€ΠΎΡ…ΠΎΠ΄ΠΈΠΌ ΠΏΠΎ всСм Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ Π΄Π»ΠΈΠ½Π°ΠΌ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ², начиная с Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ² (Π΄Π»ΠΈΠ½Π° 3) Π΄ΠΎ всСго ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° (Π΄Π»ΠΈΠ½Π° n). Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ ΠΎΠ±Ρ‰ΠΈΠΉ Π±Π°Π»Π», провСряя всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Ρ‹ ΠΈΠ· этого ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π—Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ dp для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°: Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° ΠΎΡ‚ i Π΄ΠΎ j, ΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ k ΠΌΠ΅ΠΆΠ΄Ρƒ i ΠΈ j, обновляСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ dp[i][j], ΠΊΠ°ΠΊ сумму ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ триангуляций Π»Π΅Π²ΠΎΠΉ ΠΈ ΠΏΡ€Π°Π²ΠΎΠΉ частСй ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°, Π° Ρ‚Π°ΠΊΠΆΠ΅ значСния Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°, ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π²Π΅Ρ€ΡˆΠΈΠ½Π°ΠΌΠΈ i, k ΠΈ j. 3⃣Возврат Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°: ΠžΡ‚Π²Π΅Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Π² dp[0][n-1], ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ ΠΎΠ±Ρ‰ΠΈΠΉ Π±Π°Π»Π» триангуляции для всСго ΠΌΠ½ΠΎΠ³ΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. 😎 РСшСниС:
class Solution {
public:
    int minScoreTriangulation(vector<int>& values) {
        int n = values.size();
        vector<vector<int>> dp(n, vector<int>(n, 0));
        
        for (int length = 2; length < n; ++length) {
            for (int i = 0; i < n - length; ++i) {
                int j = i + length;
                dp[i][j] = INT_MAX;
                for (int k = i + 1; k < j; ++k) {
                    dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j] + values[i] * values[j] * values[k]);
                }
            }
        }
        
        return dp[0][n - 1];
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 460. LFU Cache Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: hard Π‘ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ структуру Π΄Π°Π½Π½Ρ‹Ρ… для кСша с наимСньшим количСством использования (Least Frequently Used, LFU). Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ класс LFUCache: LFUCache(int capacity): Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ структуры Π΄Π°Π½Π½Ρ‹Ρ…. int get(int key): Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π°, Ссли ΠΊΠ»ΡŽΡ‡ сущСствуСт Π² кСшС. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ -1. void put(int key, int value): ΠžΠ±Π½ΠΎΠ²Π»ΡΠ΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π°, Ссли ΠΎΠ½ ΡƒΠΆΠ΅ присутствуСт, ΠΈΠ»ΠΈ вставляСт ΠΊΠ»ΡŽΡ‡, Ссли Π΅Π³ΠΎ Π΅Ρ‰Π΅ Π½Π΅Ρ‚. Когда кСш достигаСт своСй вмСстимости, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π°Π½Π½ΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π½Π°ΠΈΠΌΠ΅Π½Π΅Π΅ часто, ΠΏΠ΅Ρ€Π΅Π΄ вставкой Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта. Π’ этой Π·Π°Π΄Π°Ρ‡Π΅, Ссли имССтся нСсколько ΠΊΠ»ΡŽΡ‡Π΅ΠΉ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ частотой использования, аннулируСтся Π½Π°ΠΈΠΌΠ΅Π½Π΅Π΅ Π½Π΅Π΄Π°Π²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π°ΠΈΠΌΠ΅Π½Π΅Π΅ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠ»ΡŽΡ‡, для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π° Π² кСшС поддСрТиваСтся счСтчик использования. ΠšΠ»ΡŽΡ‡ с наимСньшим счСтчиком использования являСтся Π½Π°ΠΈΠΌΠ΅Π½Π΅Π΅ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ. Когда ΠΊΠ»ΡŽΡ‡ Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ вставляСтся Π² кСш, Π΅Π³ΠΎ счСтчик использования устанавливаСтся Π½Π° 1 (ΠΈΠ·-Π·Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ put). Π‘Ρ‡Π΅Ρ‚Ρ‡ΠΈΠΊ использования для ΠΊΠ»ΡŽΡ‡Π° Π² кСшС увСличиваСтся ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ get ΠΈΠ»ΠΈ put для этого ΠΊΠ»ΡŽΡ‡Π°. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ get ΠΈ put Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡΡ€Π΅Π΄Π½ΡŽΡŽ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ O(1). ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input
["LFUCache", "put", "put", "get", "put", "get", "get", "put", "get", "get", "get"]
[[2], [1, 1], [2, 2], [1], [3, 3], [2], [3], [4, 4], [1], [3], [4]]
Output
[null, null, null, 1, null, -1, 3, null, -1, 3, 4]
πŸ‘¨β€πŸ’» Алгоритм: 1⃣insert(int key, int frequency, int value): Π’ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Ρƒ частота-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² cache с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ LinkedHashSet, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π΄Π°Π½Π½ΠΎΠΉ частотС (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ пустой Set), ΠΈ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² Π½Π΅Π³ΠΎ ΠΊΠ»ΡŽΡ‡. 2⃣int get(int key): Если ΠΊΠ»ΡŽΡ‡Π° Π½Π΅Ρ‚ Π² кСшС, Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ -1. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ частоту ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· кСша. Π£Π΄Π°Π»ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡ ΠΈΠ· LinkedHashSet, связанного с частотой. Если minf == frequency ΠΈ LinkedHashSet пуст, ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ minf Π½Π° 1 ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ запись частоты ΠΈΠ· frequencies. Π’Ρ‹Π·Π²Π°Ρ‚ΡŒ insert(key, frequency + 1, value). Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. 3⃣void put(int key, int value): Если capacity <= 0, Π²Ρ‹ΠΉΡ‚ΠΈ. Если ΠΊΠ»ΡŽΡ‡ сущСствуСт, ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ get(key). Если Ρ€Π°Π·ΠΌΠ΅Ρ€ кСша Ρ€Π°Π²Π΅Π½ capacity, ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт ΠΈΠ· LinkedHashSet, связанного с minf, ΠΈ ΠΈΠ· кСша. Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ minf Π² 1. Π’Ρ‹Π·Π²Π°Ρ‚ΡŒ insert(key, 1, value). 😎 РСшСниС:
#include <unordered_map>
#include <list>

class LFUCache {
    std::unordered_map<int, std::list<std::pair<int, int>>> frequencies;
    std::unordered_map<int, std::pair<int, std::list<std::pair<int, int>>::iterator>> cache;
    int capacity;
    int minf;

    void insert(int key, int frequency, int value) {
        frequencies[frequency].emplace_back(key, value);
        cache[key] = {frequency, --frequencies[frequency].end()};
    }

public:
    LFUCache(int capacity) : capacity(capacity), minf(0) {}

    int get(int key) {
        const auto it = cache.find(key);
        if (it == cache.end()) return -1;
        const int f = it->second.first;
        const auto iter = it->second.second;
        const std::pair<int, int> kv = *iter;
        frequencies[f].erase(iter);
        if (frequencies[f].empty()) {
            frequencies.erase(f);
            if (minf == f) ++minf;
        }
        insert(key, f + 1, kv.second);
        return kv.second;
    }

    void put(int key, int value) {
        if (capacity <= 0) return;
        const auto it = cache.find(key);
        if (it != cache.end()) {
            it->second.second->second = value;
            get(key);
            return;
        }
        if (capacity == cache.size()) {
            cache.erase(frequencies[minf].front().first);
            frequencies[minf].pop_front();
            if (frequencies[minf].empty()) frequencies.erase(minf);
        }
        minf = 1;
        insert(key, 1, value);
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 69. Sqrt(x) Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: easy Π”Π°Π½ΠΎ Π½Π΅ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число x. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ Π΅Π³ΠΎ цСлочислСнный ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹ΠΉ ΠΊΠΎΡ€Π΅Π½ΡŒ, ΠΎΠΊΡ€ΡƒΠ³Π»Ρ‘Π½Π½Ρ‹ΠΉ Π²Π½
Π—Π°Π΄Π°Ρ‡Π°: 69. Sqrt(x) Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: easy Π”Π°Π½ΠΎ Π½Π΅ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число x. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ Π΅Π³ΠΎ цСлочислСнный ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹ΠΉ ΠΊΠΎΡ€Π΅Π½ΡŒ, ΠΎΠΊΡ€ΡƒΠ³Π»Ρ‘Π½Π½Ρ‹ΠΉ Π²Π½ΠΈΠ·. НСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²Ρ€ΠΎΠ΄Π΅ pow ΠΈΠ»ΠΈ sqrt. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: x = 4 Output: 2
πŸ‘¨β€πŸ’» Алгоритм: 1⃣Если x < 2, сразу Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ x, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ sqrt(0) = 0, sqrt(1) = 1 2βƒ£Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ‚ 2 Π΄ΠΎ x / 2 На ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ: pivot = (left + right) / 2 Если pivot * pivot == x, Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ pivot Если pivot * pivot < x, ΡΠ΄Π²ΠΈΠ½ΡƒΡ‚ΡŒ left = pivot + 1 Π˜Π½Π°Ρ‡Π΅ right = pivot - 1 3⃣В ΠΊΠΎΠ½Ρ†Π΅ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ right, Ρ‚.ΠΊ. ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ блиТайшим Ρ†Π΅Π»Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ≀ x 😎 РСшСниС:
class Solution {
public:
    int mySqrt(int x) {
        if (x < 2) return x;
        long num;
        int pivot, left = 2, right = x / 2;
        while (left <= right) {
            pivot = left + (right - left) / 2;
            num = (long)pivot * pivot;
            if (num > x)
                right = pivot - 1;
            else if (num < x)
                left = pivot + 1;
            else
                return pivot;
        }
        return right;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 1047. Remove All Adjacent Duplicates In String Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: easy Π’Π°ΠΌ Π΄Π°Π½Π° строка s, состоящая ΠΈΠ· строчных английских Π±ΡƒΠΊΠ². Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΎΠ² Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Π²Ρ‹Π±ΠΎΡ€Π΅ Π΄Π²ΡƒΡ… сосСдних ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… Π±ΡƒΠΊΠ² ΠΈ ΠΈΡ… ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ. ΠœΡ‹ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΎΠ² Π² s, ΠΏΠΎΠΊΠ° Π½Π΅ пСрСстанСм это Π΄Π΅Π»Π°Ρ‚ΡŒ. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ ΠΊΠΎΠ½Π΅Ρ‡Π½ΡƒΡŽ строку послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ всС Ρ‚Π°ΠΊΠΈΠ΅ удалСния Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΎΠ² Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Ρ‹. МоТно Π΄ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π²Π΅Ρ‚ ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: stones = [2,7,4,1,8,1]
Output: 1
πŸ‘¨β€πŸ’» Алгоритм: 1⃣Боздай пустой стСк для хранСния символов строки. 2βƒ£ΠŸΡ€ΠΎΡ…ΠΎΠ΄ΠΈ ΠΏΠΎ символам строки, добавляя ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ символ Π² стСк, Ссли ΠΎΠ½ Π½Π΅ совпадаСт с Π²Π΅Ρ€Ρ…Π½ΠΈΠΌ элСмСнтом стСка, ΠΈΠ½Π°Ρ‡Π΅ удаляй Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ элСмСнт. 3βƒ£ΠŸΠΎΡΠ»Π΅ прохоТдСния ΠΏΠΎ строкС, собСри ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ символы Π² стСкС Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ строку ΠΈ Π²Π΅Ρ€Π½ΠΈ Π΅Π΅. 😎 РСшСниС:
class Solution {
public:
    string removeDuplicates(string s) {
        stack<char> stack;
        for (char c : s) {
            if (!stack.empty() && stack.top() == c) {
                stack.pop();
            } else {
                stack.push(c);
            }
        }
        string result;
        while (!stack.empty()) {
            result += stack.top();
            stack.pop();
        }
        reverse(result.begin(), result.end());
        return result;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 1426. Counting Elements Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: easy Π”Π°Π½ цСлочислСнный массив arr, посчитайтС, сколько элСмСнтов x Π² Π½Π΅ΠΌ Π΅ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΡ…, Ρ‡Ρ‚ΠΎ x + 1 Ρ‚Π°ΠΊΠΆΠ΅ находится Π² arr. Если Π² arr Π΅ΡΡ‚ΡŒ Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚Ρ‹, считайтС ΠΈΡ… ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: arr = [1,2,3]
Output: 2
Explanation: 1 and 2 are counted cause 2 and 3 are in arr.
πŸ‘¨β€πŸ’» Алгоритм: 1⃣БоздайтС Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, содСрТится Π»ΠΈ элСмСнт Π² массивС. 2βƒ£Π˜Ρ‚Π΅Ρ€ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ элСмСнту массива ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, содСрТится Π»ΠΈ элСмСнт x + 1 Π² массивС. 3βƒ£Π£Π²Π΅Π»ΠΈΡ‡ΡŒΡ‚Π΅ счСтчик, Ссли x + 1 Π½Π°ΠΉΠ΄Π΅Π½, ΠΈ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика. 😎 РСшСниС:
class Solution {
public:
    int countElements(vector<int>& arr) {
        int count = 0;
        for (int x : arr) {
            if (integerInArray(arr, x + 1)) {
                count++;
            }
        }
        return count;
    }
    
    bool integerInArray(vector<int>& arr, int target) {
        for (int x : arr) {
            if (x == target) {
                return true;
            }
        }
        return false;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 895. Maximum Frequency Stack Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: hard Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°ΠΉΡ‚Π΅ структуру Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΡ…ΠΎΠΆΡƒΡŽ Π½Π° стСк, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Ρ‚Π°Π»ΠΊΠΈΠ²Π°Ρ‚ΡŒ элСмСнты Π² стСк ΠΈ Π²Ρ‹Ρ‚Π°ΡΠΊΠΈΠ²Π°Ρ‚ΡŒ ΠΈΠ· Π½Π΅Π³ΠΎ самый частый элСмСнт. Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ класс FreqStack: FreqStack() строит пустой стСк частот. void push(int val) Π·Π°Ρ‚Π°Π»ΠΊΠΈΠ²Π°Π΅Ρ‚ Ρ†Π΅Π»ΠΎΠ΅ число val Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка. int pop() удаляСт ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ самый частый элСмСнт Π² стСкС. Если Π΅ΡΡ‚ΡŒ равСнство Π² Π²Ρ‹Π±ΠΎΡ€Π΅ самого частого элСмСнта, Ρ‚ΠΎ удаляСтся ΠΈ возвращаСтся элСмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Π»ΠΈΠΆΠ΅ всСго ΠΊ Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input
["FreqStack", "push", "push", "push", "push", "push", "push", "pop", "pop", "pop", "pop"]
[[], [5], [7], [5], [7], [4], [5], [], [], [], []]
Output
[null, null, null, null, null, null, null, 5, 7, 5, 4]
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄Π²Π° словаря: freq для хранСния частоты ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта ΠΈ group для хранСния стСка элСмСнтов для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ частоты. 2βƒ£ΠŸΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ элСмСнта ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ частоту Π² freq ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π΅Π³ΠΎ Π² стСк ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ частоты Π² group. 3βƒ£ΠŸΡ€ΠΈ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠΈ элСмСнта Π½Π°ΠΉΡ‚ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ частоту, ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ элСмСнт ΠΈΠ· стСка ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ частоты ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Π΅Π³ΠΎ частоту Π² freq. Если стСк для Π΄Π°Π½Π½ΠΎΠΉ частоты становится пустым, ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ. 😎 РСшСниС:
class FreqStack {
    std::unordered_map<int, int> freq;
    std::unordered_map<int, std::stack<int>> group;
    int maxfreq = 0;

public:
    FreqStack() {}

    void push(int val) {
        int f = ++freq[val];
        if (f > maxfreq) maxfreq = f;
        group[f].push(val);
    }

    int pop() {
        int val = group[maxfreq].top();
        group[maxfreq].pop();
        if (group[maxfreq].empty()) maxfreq--;
        freq[val]--;
        return val;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 1196. How Many Apples Can You Put into the Basket Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: easy Π£ вас Π΅ΡΡ‚ΡŒ нСсколько яблок ΠΈ ΠΊΠΎΡ€Π·ΠΈΠ½Π°, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π΄ΠΎ 5000 Π΅Π΄ΠΈΠ½ΠΈΡ† вСса. Π”Π°Π½ цСлочислСнный массив weight, Π³Π΄Π΅ weight[i] β€” это вСс i-Π³ΠΎ яблока. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ максимальноС количСство яблок, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π² ΠΊΠΎΡ€Π·ΠΈΠ½Ρƒ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: weight = [100,200,150,1000]
Output: 4
Explanation: All 4 apples can be carried by the basket since their sum of weights is 1450.
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ массива Π² ΠΌΠΈΠ½-ΠΊΡƒΡ‡Ρƒ: ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠΉΡ‚Π΅ массив weight Π² ΠΌΠΈΠ½-ΠΊΡƒΡ‡Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ элСмСнты ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ. 2βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…: Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ apples для подсчСта количСства яблок ΠΈ units для записи Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ вСса ΠΊΠΎΡ€Π·ΠΈΠ½Ρ‹. 3⃣ДобавлСниС яблок Π² ΠΊΠΎΡ€Π·ΠΈΠ½Ρƒ: Пока Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ вСс ΠΊΠΎΡ€Π·ΠΈΠ½Ρ‹ мСньшС 5000 Π΅Π΄ΠΈΠ½ΠΈΡ† ΠΈ Π² ΠΊΡƒΡ‡Π΅ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ элСмСнты: Π£Π²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΠΉΡ‚Π΅ apples Π½Π° 1. Π£Π²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΠΉΡ‚Π΅ units Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½Π½ΠΎΠ΅ ΠΈΠ· ΠΊΡƒΡ‡ΠΈ. 😎 РСшСниС:
class Solution {
public:
    int maxNumberOfApples(vector<int>& weight) {
        priority_queue<int, vector<int>, greater<int>> heap(weight.begin(), weight.end());
        int apples = 0, units = 0;

        while (!heap.empty() && units + heap.top() <= 5000) {
            units += heap.top();
            heap.pop();
            apples++;
        }
        return apples;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 1219. Path with Maximum Gold Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π’ Π·ΠΎΠ»ΠΎΡ‚ΠΎΠΌ Ρ€ΡƒΠ΄Π½ΠΈΠΊΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ m x n каТдая ячСйка содСрТит Ρ†Π΅Π»ΠΎΠ΅ число, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π΅ количСство Π·ΠΎΠ»ΠΎΡ‚Π° Π² этой ячСйкС, ΠΈΠ»ΠΈ 0, Ссли ΠΎΠ½Π° пуста. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ максимальноС количСство Π·ΠΎΠ»ΠΎΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… условиях: - ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ΡΡŒ Π² ячСйкС, Π²Ρ‹ собираСтС всё Π·ΠΎΠ»ΠΎΡ‚ΠΎ ΠΈΠ· этой ячСйки. - Из вашСй ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ шаг Π²Π»Π΅Π²ΠΎ, Π²ΠΏΡ€Π°Π²ΠΎ, Π²Π²Π΅Ρ€Ρ… ΠΈΠ»ΠΈ Π²Π½ΠΈΠ·. - Π’Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ ячСйку Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π°. - Никогда Π½Π΅ посСщайтС ячСйку с 0 Π·ΠΎΠ»ΠΎΡ‚ΠΎΠΌ. - Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ ΠΈ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°Ρ‚ΡŒ сбор Π·ΠΎΠ»ΠΎΡ‚Π° с любой ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π² сСткС, которая содСрТит Π·ΠΎΠ»ΠΎΡ‚ΠΎ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: grid = [[0,6,0],[5,8,7],[0,9,0]]
Output: 24
Explanation:
[[0,6,0],
 [5,8,7],
 [0,9,0]]
Path to get the maximum gold, 9 -> 8 -> 7.
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ°: Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ константный массив DIRECTIONS для направлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΉ. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ количСство строк ΠΈ столбцов Π² сСткС. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ maxGold для хранСния максимального количСства собранного Π·ΠΎΠ»ΠΎΡ‚Π°. 2⃣Ѐункция DFS ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Ρ‚Ρ€Π΅ΠΊ: Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ dfsBacktrack для поиска ΠΏΡƒΡ‚ΠΈ с ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π·ΠΎΠ»ΠΎΡ‚ΠΎΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ DFS ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚Ρ€Π΅ΠΊΠ°. ΠžΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΠΉΡ‚Π΅ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ случай, провСряя Π²Ρ‹Ρ…ΠΎΠ΄ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ сСтки ΠΈΠ»ΠΈ ячСйки Π±Π΅Π· Π·ΠΎΠ»ΠΎΡ‚Π°. ΠŸΠΎΠΌΠ΅Ρ‚ΡŒΡ‚Π΅ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ячСйку ΠΊΠ°ΠΊ ΠΏΠΎΡΠ΅Ρ‰Ρ‘Π½Π½ΡƒΡŽ ΠΈ сохранитС Π΅Ρ‘ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π˜ΡΡΠ»Π΅Π΄ΡƒΠΉΡ‚Π΅ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Ρ‘Ρ… смСТных ячССк ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ максимальноС количСство Π·ΠΎΠ»ΠΎΡ‚Π°, Ссли Π½Π°ΠΉΠ΄Π΅Π½ Π»ΡƒΡ‡ΡˆΠΈΠΉ ΠΏΡƒΡ‚ΡŒ. Π‘Π±Ρ€ΠΎΡΡŒΡ‚Π΅ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ячСйку Π΄ΠΎ Π΅Ρ‘ исходного значСния для Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠΈΡ… исслСдований. 3βƒ£ΠŸΠΎΠΈΡΠΊ максимального Π·ΠΎΠ»ΠΎΡ‚Π°: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ†ΠΈΠΊΠ»Ρ‹ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ячСйки Π² сСткС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ максимальноС количСство Π·ΠΎΠ»ΠΎΡ‚Π°, начиная с этой ячСйки, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ dfsBacktrack. ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ maxGold ΠΏΡ€ΠΈ Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ ΠΏΡƒΡ‚ΠΈ. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ maxGold. 😎 РСшСниС:
class Solution {
public:
    int getMaximumGold(vector<vector<int>>& grid) {
        int rows = grid.size(), cols = grid[0].size(), maxGold = 0;
        for (int row = 0; row < rows; ++row) {
            for (int col = 0; col < cols; ++col) {
                maxGold = max(maxGold, dfsBacktrack(grid, rows, cols, row, col));
            }
        }
        return maxGold;
    }

private:
    int directions[5] = {0, 1, 0, -1, 0};

    int dfsBacktrack(vector<vector<int>>& grid, int rows, int cols, int row, int col) {
        if (row < 0 || col < 0 || row >= rows || col >= cols || grid[row][col] == 0) return 0;
        int originalVal = grid[row][col];
        grid[row][col] = 0;
        int maxGold = 0;
        for (int i = 0; i < 4; ++i) {
            maxGold = max(maxGold, dfsBacktrack(grid, rows, cols, row + directions[i], col + directions[i + 1]));
        }
        grid[row][col] = originalVal;
        return maxGold + originalVal;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 468. Validate IP Address Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Допустимый IPv4-адрСс β€” это IP Π² Ρ„ΠΎΡ€ΠΌΠ΅ "x1.x2.x3.x4", Π³Π΄Π΅ 0 <= xi <= 255 ΠΈ xi Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π²Π΅Π΄ΡƒΡ‰ΠΈΠ΅ Π½ΡƒΠ»ΠΈ. НапримСр, "192.168.1.1" ΠΈ "192.168.1.0" ΡΠ²Π»ΡΡŽΡ‚ΡΡ допустимыми IPv4-адрСсами, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ "192.168.01.1", "192.168.1.00" ΠΈ "192.168@1.1" ΡΠ²Π»ΡΡŽΡ‚ΡΡ нСдопустимыми IPv4-адрСсами. Допустимый IPv6-адрСс β€” это IP Π² Ρ„ΠΎΡ€ΠΌΠ΅ "x1:x2:x3:x4:x5:x6:x7 ", Π³Π΄Π΅: 1 <= xi.length <= 4 xi β€” это ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Π°Ρ строка, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ†ΠΈΡ„Ρ€Ρ‹, строчныС английскиС Π±ΡƒΠΊΠ²Ρ‹ ('a' Π΄ΠΎ 'f') ΠΈ прописныС английскиС Π±ΡƒΠΊΠ²Ρ‹ ('A' Π΄ΠΎ 'F'). Π’Π΅Π΄ΡƒΡ‰ΠΈΠ΅ Π½ΡƒΠ»ΠΈ Π² xi Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: queryIP = "172.16.254.1"
Output: "IPv4"
Explanation: This is a valid IPv4 address, return "IPv4".
πŸ‘¨β€πŸ’» Алгоритм: 1⃣Для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ адрСса IPv4: Π Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ IP Π½Π° Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ части ΠΏΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŽ ".". ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ подстроку: ЯвляСтся Π»ΠΈ ΠΎΠ½Π° Ρ†Π΅Π»Ρ‹ΠΌ числом ΠΌΠ΅ΠΆΠ΄Ρƒ 0 ΠΈ 255. НС содСрТит Π»ΠΈ ΠΎΠ½Π° Π²Π΅Π΄ΡƒΡ‰ΠΈΡ… Π½ΡƒΠ»Π΅ΠΉ (ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ β€” число "0"). 2⃣Для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ адрСса IPv6: Π Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ IP Π½Π° восСмь частСй ΠΏΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŽ ":". ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ подстроку: ЯвляСтся Π»ΠΈ ΠΎΠ½Π° ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹ΠΌ числом Π΄Π»ΠΈΠ½ΠΎΠΉ ΠΎΡ‚ 1 Π΄ΠΎ 4 символов. 3⃣Если IP Π½Π΅ соотвСтствуСт Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ², Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ "Neither". 😎 РСшСниС:
class Solution {
public:
    std::string validateIPv4(const std::string& IP) {
        std::vector<std::string> nums = split(IP, '.');
        if (nums.size() != 4) return "Neither";
        for (std::string& x : nums) {
            if (x.size() == 0 || x.size() > 3) return "Neither";
            if (x[0] == '0' && x.size() != 1) return "Neither";
            if (!std::all_of(x.begin(), x.end(), ::isdigit)) return "Neither";
            if (std::stoi(x) > 255) return "Neither";
        }
        return "IPv4";
    }

    std::string validateIPv6(const std::string& IP) {
        std::vector<std::string> nums = split(IP, ':');
        if (nums.size() != 8) return "Neither";
        std::unordered_set<char> hexdigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                                              'a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F'};
        for (std::string& x : nums) {
            if (x.size() == 0 || x.size() > 4) return "Neither";
            for (char ch : x) {
                if (hexdigits.find(ch) == hexdigits.end()) return "Neither";
            }
        }
        return "IPv6";
    }

    std::string validIPAddress(const std::string& IP) {
        if (std::count(IP.begin(), IP.end(), '.') == 3) {
            return validateIPv4(IP);
        } else if (std::count(IP.begin(), IP.end(), ':') == 7) {
            return validateIPv6(IP);
        } else {
            return "Neither";
        }
    }

private:
    std::vector<std::string> split(const std::string& s, char delimiter) {
        std::vector<std::string> tokens;
        std::string token;
        std::istringstream tokenStream(s);
        while (std::getline(tokenStream, token, delimiter)) {
            tokens.push_back(token);
        }
        return tokens;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 360. Sort Transformed Array Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ отсортированный массив Ρ†Π΅Π»Ρ‹Ρ… чисСл nums ΠΈ Ρ‚Ρ€ΠΈ Ρ†Π΅Π»Ρ‹Ρ… числа a, b ΠΈ c. ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΡ‡Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π²ΠΈΠ΄Π° f(x) = ax^2 + bx + c ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ элСмСнту nums[i] Π² массивС ΠΈ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ массив Π² отсортированном порядкС. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: nums = [-4,-2,2,4], a = 1, b = 3, c = 5
Output: [3,9,15,33]
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ сортировка ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт массива nums ΠΏΠΎ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ΠΈΡ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ f(x) = ax^2 + bx + c ΠΈ сохраняСм Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π² массив transformed. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ поразрядной сортировки для сортировки массива transformed. 2βƒ£ΠŸΠΎΡ€Π°Π·Ρ€ΡΠ΄Π½Π°Ρ сортировка Находим максимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ Π² массивС для опрСдСлСния количСства Ρ†ΠΈΡ„Ρ€. ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ ΠΏΠΎΡ€Π°Π·Ρ€ΡΠ΄Π½ΡƒΡŽ сортировку ΠΊ массиву transformed. 3⃣Бортировка ΠΏΠΎ Ρ†ΠΈΡ„Ρ€Π΅ Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ†ΠΈΡ„Ρ€Ρ‹ (разряда) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ подсчСт для сортировки массива. 😎 РСшСниС:
#include <vector>
#include <algorithm>
#include <cmath>

class Solution {
public:
    std::vector<int> sortTransformedArray(std::vector<int>& nums, int a, int b, int c) {
        std::vector<int> transformed(nums.size());
        for (size_t i = 0; i < nums.size(); ++i) {
            transformed[i] = a * nums[i] * nums[i] + b * nums[i] + c;
        }

        radixSort(transformed);

        return transformed;
    }

private:
    void radixSort(std::vector<int>& array) {
        int maxElement = abs(array[0]);
        for (int num : array) {
            maxElement = std::max(maxElement, abs(num));
        }

        for (int placeValue = 1; maxElement / placeValue > 0; placeValue *= 10) {
            countingSortByDigit(array, placeValue);
        }

        std::vector<int> negatives, positives;
        for (int num : array) {
            if (num < 0) negatives.push_back(num);
            else positives.push_back(num);
        }

        std::sort(negatives.begin(), negatives.end());
        std::sort(positives.begin(), positives.end());

        std::merge(negatives.begin(), negatives.end(), positives.begin(), positives.end(), array.begin());
    }

    void countingSortByDigit(std::vector<int>& array, int placeValue) {
        std::vector<int> output(array.size());
        std::vector<int> count(10, 0);

        for (int num : array) {
            int digit = (abs(num) / placeValue) % 10;
            count[digit]++;
        }

        for (int i = 1; i < 10; ++i) {
            count[i] += count[i - 1];
        }

        for (int i = array.size() - 1; i >= 0; --i) {
            int num = array[i];
            int digit = (abs(num) / placeValue) % 10;
            output[count[digit] - 1] = num;
            count[digit]--;
        }

        for (size_t i = 0; i < array.size(); ++i) {
            array[i] = output[i];
        }
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 994. Rotting Oranges Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ m x n сСтка, Π³Π΄Π΅ каТдая ячСйка ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ: 0, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π΅ ΠΏΡƒΡΡ‚ΡƒΡŽ ячСйку, 1, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π΅ свСТий апСльсин, 2, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π΅ Π³Π½ΠΈΠ»ΠΎΠΉ апСльсин. ΠšΠ°ΠΆΠ΄ΡƒΡŽ ΠΌΠΈΠ½ΡƒΡ‚Ρƒ любой свСТий апСльсин, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ находится Π² 4-Ρ… Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎ смСТной ячСйкС с Π³Π½ΠΈΠ»Ρ‹ΠΌ апСльсином, становится Π³Π½ΠΈΠ»Ρ‹ΠΌ. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ минимальноС количСство ΠΌΠΈΠ½ΡƒΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ, ΠΏΠΎΠΊΠ° Π² ячСйкС Π½Π΅ останСтся свСТих апСльсинов. Если это Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ -1. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: grid = [[2,1,1],[0,1,1],[1,0,1]]
Output: -1
Explanation: The orange in the bottom left corner (row 2, column 0) is never rotten, because rotting only happens 4-directionally.
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈ подсчСт апСльсинов: ΠŸΡ€ΠΎΠΉΠ΄ΠΈΡ‚Π΅ ΠΏΠΎ всСй сСткС, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ всС Π³Π½ΠΈΠ»Ρ‹Π΅ Π°ΠΏΠ΅Π»ΡŒΡΠΈΠ½Ρ‹ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΈ подсчитайтС ΠΎΠ±Ρ‰Π΅Π΅ количСство свСТих апСльсинов. Если Π½Π΅Ρ‚ свСТих апСльсинов, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ 0. 2βƒ£Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ BFS для распространСния Π³Π½ΠΈΠ»ΠΈ: ВыполняйтС BFS, начиная с всСх Π³Π½ΠΈΠ»Ρ‹Ρ… апСльсинов, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° апСльсин становится Π³Π½ΠΈΠ»Ρ‹ΠΌ, ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°ΠΉΡ‚Π΅ счСтчик свСТих апСльсинов. Если свСТих апСльсинов большС Π½Π΅ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ количСство ΠΌΠΈΠ½ΡƒΡ‚. 3βƒ£ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ свСТих апСльсинов: Если послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ BFS всС Π΅Ρ‰Π΅ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ свСТиС Π°ΠΏΠ΅Π»ΡŒΡΠΈΠ½Ρ‹, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ -1. 😎 РСшСниС:
class Solution {
public:
    int orangesRotting(vector<vector<int>>& grid) {
        queue<pair<int, int>> q;
        int freshCount = 0;
        int minutes = 0;
        vector<vector<int>> directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
        
        for (int i = 0; i < grid.size(); i++) {
            for (int j = 0; j < grid[0].size(); j++) {
                if (grid[i][j] == 2) {
                    q.push({i, j});
                } else if (grid[i][j] == 1) {
                    freshCount++;
                }
            }
        }
        
        if (freshCount == 0) return 0;
        
        while (!q.empty()) {
            int size = q.size();
            for (int i = 0; i < size; i++) {
                auto [x, y] = q.front(); q.pop();
                for (auto dir : directions) {
                    int nx = x + dir[0], ny = y + dir[1];
                    if (nx >= 0 && nx < grid.size() && ny >= 0 && ny < grid[0].size() && grid[nx][ny] == 1) {
                        grid[nx][ny] = 2;
                        freshCount--;
                        q.push({nx, ny});
                    }
                }
            }
            if (!q.empty()) {
                minutes++;
            }
        }
        
        return freshCount == 0 ? minutes : -1;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 234. Palindrome Linked List Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: easy Π”Π°Π½ Π³ΠΎΠ»ΠΎΠ²Π½ΠΎΠΉ элСмСнт односвязного списка. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ true, Ссли список являС
Π—Π°Π΄Π°Ρ‡Π°: 234. Palindrome Linked List Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: easy Π”Π°Π½ Π³ΠΎΠ»ΠΎΠ²Π½ΠΎΠΉ элСмСнт односвязного списка. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ true, Ссли список являСтся ΠΏΠ°Π»ΠΈΠ½Π΄Ρ€ΠΎΠΌΠΎΠΌ, ΠΈ false Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: head = [1,2,2,1]
Output: true
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ односвязного списка Π² массив: Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ ΠΏΡ€ΠΎΠΉΠ΄ΠΈΡ‚Π΅ ΠΏΠΎ односвязному списку, добавляя ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² массив. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ currentNode, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΡƒΠ·Π΅Π». На ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ добавляйтС currentNode.val Π² массив ΠΈ обновляйтС currentNode, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π» Π½Π° currentNode.next. ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚Π΅ Ρ†ΠΈΠΊΠ», ΠΊΠΎΠ³Π΄Π° currentNode ΡƒΠΊΠ°ΠΆΠ΅Ρ‚ Π½Π° null. 2βƒ£ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° массива Π½Π° ΠΏΠ°Π»ΠΈΠ½Π΄Ρ€ΠΎΠΌ: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ с двумя указатСлями для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ массива Π½Π° ΠΏΠ°Π»ΠΈΠ½Π΄Ρ€ΠΎΠΌ. РазмСститС ΠΎΠ΄ΠΈΠ½ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π² Π½Π°Ρ‡Π°Π»Π΅ массива, Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π² ΠΊΠΎΠ½Ρ†Π΅. На ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС провСряйтС, Ρ€Π°Π²Π½Ρ‹ Π»ΠΈ значСния, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΠΉΡ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΊ Ρ†Π΅Π½Ρ‚Ρ€Ρƒ, ΠΏΠΎΠΊΠ° ΠΎΠ½ΠΈ Π½Π΅ встрСтятся. 3⃣БравнСниС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ: ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ значСния ΡƒΠ·Π»ΠΎΠ², Π° Π½Π΅ сами ΡƒΠ·Π»Ρ‹. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ node_1.val == node_2.val для сравнСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΡƒΠ·Π»ΠΎΠ². Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ ΡƒΠ·Π»ΠΎΠ² ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² node_1 == node_2 Π½Π΅ даст ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°. 😎 РСшСниС:
class Solution {
public:
    bool isPalindrome(ListNode* head) {
        vector<int> vals;

        ListNode* currentNode = head;
        while (currentNode != nullptr) {
            vals.push_back(currentNode->val);
            currentNode = currentNode->next;
        }

        int front = 0;
        int back = vals.size() - 1;
        while (front < back) {
            if (vals[front] != vals[back]) {
                return false;
            }
            front++;
            back--;
        }
        return true;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 567. Permutation in String Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½Ρ‹ Π΄Π²Π΅ строки s1 ΠΈ s2. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ true, Ссли s2 содСрТит пСрСстановку s1, ΠΈΠ»ΠΈ false Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ true, Ссли ΠΎΠ΄Π½Π° ΠΈΠ· пСрСстановок s1 являСтся подстрокой s2. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: s1 = "ab", s2 = "eidbaooo"
Output: true
Explanation: s2 contains one permutation of s1 ("ba").
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ массив для подсчСта символов Π² строкС s1. Π—Π°Ρ‚Π΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ массив для ΠΏΠ΅Ρ€Π²Ρ‹Ρ… len(s1) символов строки s2. 2βƒ£Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΊΠΎΠ»ΡŒΠ·ΡΡ‰Π΅Π΅ ΠΎΠΊΠ½ΠΎ для пСрСмСщСния ΠΏΠΎ строкС s2. Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΎΠΊΠ½Π° ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ массив подсчСта символов ΠΈ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ с массивом для строки s1. 3⃣Если массивы ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ Π½Π° любом этапС, Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ true. Если ΠΎΠΊΠ½ΠΎ достигаСт ΠΊΠΎΠ½Ρ†Π° строки s2 ΠΈ совпадСний Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ, Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ false. 😎 РСшСниС:
class Solution {
public:
    bool checkInclusion(string s1, string s2) {
        int s1Len = s1.size(), s2Len = s2.size();
        if (s1Len > s2Len) return false;
        
        vector<int> s1Count(26, 0), s2Count(26, 0);
        for (int i = 0; i < s1Len; i++) {
            s1Count[s1[i] - 'a']++;
            s2Count[s2[i] - 'a']++;
        }
        
        for (int i = 0; i < s2Len - s1Len; i++) {
            if (s1Count == s2Count) return true;
            s2Count[s2[i] - 'a']--;
            s2Count[s2[i + s1Len] - 'a']++;
        }
        
        return s1Count == s2Count;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 736. Parse Lisp Expression Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: hard Нам Π΄Π°Π½ массив asteroids, состоящий ΠΈΠ· Ρ†Π΅Π»Ρ‹Ρ… чисСл, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… астСроиды Π² ряд. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ астСроида Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€, Π° Π·Π½Π°ΠΊ - Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ двиТСния (ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ - Π²ΠΏΡ€Π°Π²ΠΎ, ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ - Π²Π»Π΅Π²ΠΎ). ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ астСроид двиТСтся с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ состояниС астСроидов послС всСх столкновСний. Если Π΄Π²Π° астСроида столкнутся, мСньший ΠΈΠ· Π½ΠΈΡ… взорвСтся. Если ΠΎΠ±Π° ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, Ρ‚ΠΎ взорвутся ΠΎΠ±Π°. Π”Π²Π° астСроида, двиТущиСся Π² ΠΎΠ΄Π½ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ, Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ встрСтятся. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: expression = "(let x 2 (mult x (let x 3 y 4 (add x y))))"
Output: 14
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для ΠΎΡ†Π΅Π½ΠΊΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. 2βƒ£Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ рСкурсивный ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ (let, add, mult, ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…). 3βƒ£Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ для отслСТивания Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ области видимости. 😎 РСшСниС:
class Solution {
public:
    int evaluate(string expression) {
        return evaluate(expression, {});
    }

private:
    int evaluate(string expression, unordered_map<string, int> env) {
        if (expression[0] != '(') {
            if (isdigit(expression[0]) || expression[0] == '-') {
                return stoi(expression);
            }
            return env[expression];
        }

        vector<string> tokens = tokenize(expression);
        if (tokens[0] == "let") {
            for (size_t i = 1; i < tokens.size() - 2; i += 2) {
                env[tokens[i]] = evaluate(tokens[i + 1], env);
            }
            return evaluate(tokens.back(), env);
        } else if (tokens[0] == "add") {
            return evaluate(tokens[1], env) + evaluate(tokens[2], env);
        } else if (tokens[0] == "mult") {
            return evaluate(tokens[1], env) * evaluate(tokens[2], env);
        }
        return 0;
    }

    vector<string> tokenize(const string& expression) {
        vector<string> tokens;
        string token;
        int parens = 0;
        istringstream iss(expression);
        char c;

        while (iss >> c) {
            if (c == '(') {
                parens++;
                if (parens == 1) continue;
            } else if (c == ')') {
                parens--;
                if (parens == 0) {
                    tokens.push_back(tokenize(token));
                    token = "";
                    continue;
                }
            } else if (c == ' ' && parens == 1) {
                if (!token.empty()) {
                    tokens.push_back(token);
                    token = "";
                }
                continue;
            }
            token += c;
        }
        if (!token.empty()) {
            tokens.push_back(token);
        }
        return tokens;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 482. License Key Formatting Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: easy Π’Π°ΠΌ Π΄Π°Π½ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡, прСдставлСнный Π² Π²ΠΈΠ΄Π΅ строки s, которая состои
Π—Π°Π΄Π°Ρ‡Π°: 482. License Key Formatting Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: easy Π’Π°ΠΌ Π΄Π°Π½ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡, прСдставлСнный Π² Π²ΠΈΠ΄Π΅ строки s, которая состоит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· Π±ΡƒΠΊΠ²Π΅Π½Π½ΠΎ-Ρ†ΠΈΡ„Ρ€ΠΎΠ²Ρ‹Ρ… символов ΠΈ Ρ‚ΠΈΡ€Π΅. Π‘Ρ‚Ρ€ΠΎΠΊΠ° Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π° Π½Π° n + 1 Π³Ρ€ΡƒΠΏΠΏ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ n Ρ‚ΠΈΡ€Π΅. Π’Π°ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ Π΄Π°Π½ΠΎ Ρ†Π΅Π»ΠΎΠ΅ число k. ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠ΅Ρ€Π΅Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ строку s Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ каТдая Π³Ρ€ΡƒΠΏΠΏΠ° содСрТала Ρ€ΠΎΠ²Π½ΠΎ k символов, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΡ€ΠΎΡ‡Π΅ k, Π½ΠΎ всС ΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ символ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠ΅ΠΆΠ΄Ρƒ двумя Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ вставлСно Ρ‚ΠΈΡ€Π΅, ΠΈ всС строчныС Π±ΡƒΠΊΠ²Ρ‹ слСдуСт ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π² прописныС. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π΅Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: s = "5F3Z-2e-9-w", k = 4
Output: "5F3Z-2E9W"
Explanation: The string s has been split into two parts, each part has 4 characters.
Note that the two extra dashes are not needed and can be removed.
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ УстановитС count Π² 0 для подсчСта символов Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π³Ρ€ΡƒΠΏΠΏΠ΅. УстановитС ans Π² ΠΏΡƒΡΡ‚ΡƒΡŽ строку для хранСния ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°. 2βƒ£Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΡ ΠΏΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ строкС Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС ΠŸΡ€ΠΎΠΏΡƒΡΠΊΠ°ΠΉΡ‚Π΅ символы '-'. Если Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ символ Π½Π΅ '-', Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π΅Π³ΠΎ Π² ans ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΡŒΡ‚Π΅ count Π½Π° 1. Если count достигаСт k, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ '-' Π² ans ΠΈ ΡΠ±Ρ€ΠΎΡΡŒΡ‚Π΅ count. 3βƒ£Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Π΅ΡΡ‚ΡŒ Π»ΠΈ Π² ΠΊΠΎΠ½Ρ†Π΅ строки ans Ρ‚ΠΈΡ€Π΅, ΠΈ ΡƒΠ΄Π°Π»ΠΈΡ‚Π΅ Π΅Π³ΠΎ, Ссли ΠΎΠ½ΠΎ Π΅ΡΡ‚ΡŒ. ΠŸΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ строку ans ΠΈ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ Π΅Ρ‘. 😎 РСшСниС:
class Solution {
public:
    string licenseKeyFormatting(string s, int k) {
        int count = 0;
        string ans;
        for (int i = s.length() - 1; i >= 0; i--) {
            if (s[i] != '-') {
                ans.push_back(toupper(s[i]));
                count++;
                if (count == k) {
                    ans.push_back('-');
                    count = 0;
                }
            }
        }
        if (!ans.empty() && ans.back() == '-') {
            ans.pop_back();
        }
        reverse(ans.begin(), ans.end());
        return ans;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 376. Wiggle Subsequence Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium ΠšΠΎΠ»Π΅Π±Π»ΡŽΡ‰Π°ΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ β€” это ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ разност
Π—Π°Π΄Π°Ρ‡Π°: 376. Wiggle Subsequence Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium ΠšΠΎΠ»Π΅Π±Π»ΡŽΡ‰Π°ΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ β€” это ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ разности ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ числами строго Ρ‡Π΅Ρ€Π΅Π΄ΡƒΡŽΡ‚ΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ. ΠŸΠ΅Ρ€Π²Π°Ρ Ρ€Π°Π·Π½ΠΎΡΡ‚ΡŒ (Ссли ΠΎΠ½Π° сущСствуСт) ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ, Ρ‚Π°ΠΊ ΠΈ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ. ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ с ΠΎΠ΄Π½ΠΈΠΌ элСмСнтом ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ с двумя Π½Π΅Ρ€Π°Π²Π½Ρ‹ΠΌΠΈ элСмСнтами Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠΎΠ»Π΅Π±Π»ΡŽΡ‰ΠΈΠΌΠΈΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡΠΌΠΈ. НапримСр, [1, 7, 4, 9, 2, 5] β€” это ΠΊΠΎΠ»Π΅Π±Π»ΡŽΡ‰Π°ΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ разности (6, -3, 5, -7, 3) Ρ‡Π΅Ρ€Π΅Π΄ΡƒΡŽΡ‚ΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π½Π΅Π΅, [1, 4, 7, 2, 5] ΠΈ [1, 7, 4, 5, 5] Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠΎΠ»Π΅Π±Π»ΡŽΡ‰ΠΈΠΌΠΈΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡΠΌΠΈ. ΠŸΠ΅Ρ€Π²Π°Ρ Π½Π΅ являСтся, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π΅ разности ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅, Π° вторая Π½Π΅ являСтся, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ послСдняя Ρ€Π°Π·Π½ΠΎΡΡ‚ΡŒ Ρ€Π°Π²Π½Π° Π½ΡƒΠ»ΡŽ. ΠŸΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ получаСтся ΠΏΡƒΡ‚Π΅ΠΌ удалСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… элСмСнтов (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, нуля) ΠΈΠ· исходной ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ с сохранСниСм ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ элСмСнтов Π² ΠΈΡ… ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΌ порядкС. Π”Π°Π½ цСлочислСнный массив nums, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ Π΄Π»ΠΈΠ½Ρƒ самой Π΄Π»ΠΈΠ½Π½ΠΎΠΉ ΠΊΠΎΠ»Π΅Π±Π»ΡŽΡ‰Π΅ΠΉΡΡ ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΠ· nums. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: nums = [1,7,4,9,2,5]
Output: 6
Explanation: The entire sequence is a wiggle sequence with differences (6, -3, 5, -7, 3).
πŸ‘¨β€πŸ’» Алгоритм: 1⃣Для понимания этого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° создайтС Π΄Π²Π° массива для динамичСского программирования, Π½Π°Π·Π²Π°Π½Π½Ρ‹Ρ… up ΠΈ down. Π­Ρ‚ΠΈ массивы Π±ΡƒΠ΄ΡƒΡ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΄Π»ΠΈΠ½Ρ‹ Π½Π°ΠΈΠ±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΊΠΎΠ»Π΅Π±Π»ΡŽΡ‰ΠΈΡ…ΡΡ ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ, Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΡ…ΡΡ соотвСтствСнно восходящим ΠΈΠ»ΠΈ нисходящим ΠΊΠΎΠ»Π΅Π±Π°Π½ΠΈΠ΅ΠΌ. 2⃣up[i] относится ΠΊ Π΄Π»ΠΈΠ½Π΅ самой Π΄Π»ΠΈΠ½Π½ΠΎΠΉ ΠΊΠΎΠ»Π΅Π±Π»ΡŽΡ‰Π΅ΠΉΡΡ ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, Ссли Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ i-ΠΉ элСмСнт ΠΊΠ°ΠΊ послСдний элСмСнт ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉΡΡ восходящим ΠΊΠΎΠ»Π΅Π±Π°Π½ΠΈΠ΅ΠΌ. Аналогично, down[i] относится ΠΊ Π΄Π»ΠΈΠ½Π΅ самой Π΄Π»ΠΈΠ½Π½ΠΎΠΉ ΠΊΠΎΠ»Π΅Π±Π»ΡŽΡ‰Π΅ΠΉΡΡ ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Ссли Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ i-ΠΉ элСмСнт ΠΊΠ°ΠΊ послСдний элСмСнт ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉΡΡ нисходящим ΠΊΠΎΠ»Π΅Π±Π°Π½ΠΈΠ΅ΠΌ. 3⃣up[i] обновляСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ восходящСС ΠΊΠΎΠ»Π΅Π±Π°Π½ΠΈΠ΅, Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π΅Π΅ΡΡ Π½Π° i-ΠΌ элСмСнтС. Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ up[i], Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡ‡Π΅ΡΡ‚ΡŒ максимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ всСх ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ, Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΡ…ΡΡ нисходящим ΠΊΠΎΠ»Π΅Π±Π°Π½ΠΈΠ΅ΠΌ, Ρ‚.Π΅. down[j], для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ j<i ΠΈ nums[i]>nums[j]. Аналогично, down[i] обновляСтся ΠΏΡ€ΠΈ Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ нисходящСго колСбания. 😎 РСшСниС:
class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        if (nums.size() < 2)
            return nums.size();
        vector<int> up(nums.size(), 0);
        vector<int> down(nums.size(), 0);
        for (int i = 1; i < nums.size(); i++) {
            for (int j = 0; j < i; j++) {
                if (nums[i] > nums[j]) {
                    up[i] = max(up[i], down[j] + 1);
                } else if (nums[i] < nums[j]) {
                    down[i] = max(down[i], up[j] + 1);
                }
            }
        }
        return 1 + max(down[nums.size() - 1], up[nums.size() - 1]);
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 1197. Minimum Knight Moves Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium На бСсконСчной ΡˆΠ°Ρ…ΠΌΠ°Ρ‚Π½ΠΎΠΉ доскС с ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌΠΈ ΠΎΡ‚ -бСсконСчности Π΄ΠΎ +бСсконСчности Ρƒ вас Π΅ΡΡ‚ΡŒ конь Π½Π° ΠΊΠ»Π΅Ρ‚ΠΊΠ΅ [0, 0]. Π£ коня Π΅ΡΡ‚ΡŒ 8 Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Ρ…ΠΎΠ΄ΠΎΠ². ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ…ΠΎΠ΄ прСдставляСт собой Π΄Π²Π° ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π° Π² ΠΊΠ°Ρ€Π΄ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ, Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ Π² ΠΎΡ€Ρ‚ΠΎΠ³ΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ минимальноС количСство шагов, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… для пСрСмСщСния коня Π½Π° ΠΊΠ»Π΅Ρ‚ΠΊΡƒ [x, y]. ГарантируСтся, Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π²Π΅Ρ‚ сущСствуСт. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: x = 5, y = 5
Output: 4
Explanation: [0, 0] β†’ [2, 1] β†’ [4, 2] β†’ [3, 4] β†’ [5, 5]
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ структур Π΄Π°Π½Π½Ρ‹Ρ…: Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π΄Π²Π΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ для хранСния ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ ΠΈ расстояний: ΠΎΠ΄Π½Ρƒ для двиТСния ΠΎΡ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ, Π΄Ρ€ΡƒΠ³ΡƒΡŽ β€” ΠΎΡ‚ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π΄Π²Π΅ ΠΊΠ°Ρ€Ρ‚Ρ‹ для хранСния посСщСнных ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ ΠΈ расстояний: ΠΎΠ΄Π½Ρƒ для двиТСния ΠΎΡ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ, Π΄Ρ€ΡƒΠ³ΡƒΡŽ β€” ΠΎΡ‚ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ. 2⃣РСализация Π΄Π²ΡƒΠ½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠ³ΠΎ поиска Π² ΡˆΠΈΡ€ΠΈΠ½Ρƒ (BFS): ВыполняйтС шаги ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ, Ρ€Π°ΡΡˆΠΈΡ€ΡΡ ΠΊΡ€ΡƒΠ³ΠΈ поиска ΠΊΠ°ΠΊ ΠΎΡ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ, Ρ‚Π°ΠΊ ΠΈ ΠΎΡ‚ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ. Если ΠΊΡ€ΡƒΠ³ΠΈ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‚ΡΡ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ сумму расстояний Π΄ΠΎ Ρ‚ΠΎΡ‡ΠΊΠΈ пСрСсСчСния. 3βƒ£Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ ΠΊΡ€ΡƒΠ³ΠΎΠ² поиска: Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ Ρ€Π°ΡΡˆΠΈΡ€ΡΠΉΡ‚Π΅ ΠΊΡ€ΡƒΠ³ поиска ΠΏΠΎ всСм Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ Ρ…ΠΎΠ΄Π°ΠΌ коня. ΠžΠ±Π½ΠΎΠ²Π»ΡΠΉΡ‚Π΅ расстояния ΠΈ добавляйтС Π½ΠΎΠ²Ρ‹Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, Ссли ΠΎΠ½ΠΈ Π΅Ρ‰Π΅ Π½Π΅ Π±Ρ‹Π»ΠΈ посСщСны. Π£Π²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΠΉΡ‚Π΅ units Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½Π½ΠΎΠ΅ ΠΈΠ· ΠΊΡƒΡ‡ΠΈ. 😎 РСшСниС:
#include <deque>
#include <unordered_map>
#include <string>
#include <vector>

using namespace std;

class Solution {
public:
    int minKnightMoves(int x, int y) {
        vector<vector<int>> offsets = {{1, 2}, {2, 1}, {2, -1}, {1, -2},
                                       {-1, -2}, {-2, -1}, {-2, 1}, {-1, 2}};
        
        deque<vector<int>> originQueue = {{0, 0, 0}};
        unordered_map<string, int> originDistance = {{"0,0", 0}};
        
        deque<vector<int>> targetQueue = {{x, y, 0}};
        unordered_map<string, int> targetDistance = {{to_string(x) + "," + to_string(y), 0}};
        
        while (true) {
            auto origin = originQueue.front();
            originQueue.pop_front();
            string originKey = to_string(origin[0]) + "," + to_string(origin[1]);
            if (targetDistance.find(originKey) != targetDistance.end()) {
                return origin[2] + targetDistance[originKey];
            }
            
            auto target = targetQueue.front();
            targetQueue.pop_front();
            string targetKey = to_string(target[0]) + "," + to_string(target[1]);
            if (originDistance.find(targetKey) != originDistance.end()) {
                return target[2] + originDistance[targetKey];
            }
            
            for (auto& offset : offsets) {
                vector<int> nextOrigin = {origin[0] + offset[0], origin[1] + offset[1], origin[2] + 1};
                string nextOriginKey = to_string(nextOrigin[0]) + "," + to_string(nextOrigin[1]);
                if (originDistance.find(nextOriginKey) == originDistance.end()) {
                    originQueue.push_back(nextOrigin);
                    originDistance[nextOriginKey] = nextOrigin[2];
                }
                
                vector<int> nextTarget = {target[0] + offset[0], target[1] + offset[1], target[2] + 1};
                string nextTargetKey = to_string(nextTarget[0]) + "," + to_string(nextTarget[1]);
                if (targetDistance.find(nextTargetKey) == targetDistance.end()) {
                    targetQueue.push_back(nextTarget);
                    targetDistance[nextTargetKey] = nextTarget[2];
                }
            }
        }
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 1041. Robot Bounded In Circle Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium На бСсконСчной плоскости Ρ€ΠΎΠ±ΠΎΡ‚ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ стоит Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ (0, 0) ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ Π»ΠΈΡ†ΠΎΠΌ Π½Π° сСвСр. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ: сСвСрноС Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ - это ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ оси y. юТноС Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ - это ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ оси y. восточноС Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ - это ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ оси x. Π·Π°ΠΏΠ°Π΄Π½ΠΎΠ΅ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ - это ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ оси x. Ρ€ΠΎΠ±ΠΎΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… ΠΊΠΎΠΌΠ°Π½Π΄: "G": ΠΈΠ΄Ρ‚ΠΈ прямо 1 Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ. "L": ΠΏΠΎΠ²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π½Π° 90 градусов Π²Π»Π΅Π²ΠΎ (Ρ‚.Π΅, "R": ΠΏΠΎΠ²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π½Π° 90 градусов Π²ΠΏΡ€Π°Π²ΠΎ (Ρ‚. Π΅. ΠΏΠΎ часовой стрСлкС). Π ΠΎΠ±ΠΎΡ‚ выполняСт Π΄Π°Π½Π½Ρ‹Π΅ инструкции ΠΏΠΎ порядку ΠΈ повторяСт ΠΈΡ… Π΄ΠΎ бСсконСчности. ВозвращаСтся true Ρ‚ΠΎΠ³Π΄Π° ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° Π² плоскости сущСствуСт ΠΎΠΊΡ€ΡƒΠΆΠ½ΠΎΡΡ‚ΡŒ, такая, Ρ‡Ρ‚ΠΎ Ρ€ΠΎΠ±ΠΎΡ‚ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΠΎΠΊΠΈΠ΄Π°Π΅Ρ‚ Π΅Π΅. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: instructions = "GGLLGG"
Output: true
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£ΠŸΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ повСдСния Ρ€ΠΎΠ±ΠΎΡ‚Π°: ΠœΡ‹ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ, ΠΊΠ°ΠΊ Ρ€ΠΎΠ±ΠΎΡ‚ двиТСтся Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΠ΄Π½ΠΎΠΉ сСрии ΠΊΠΎΠΌΠ°Π½Π΄. Если ΠΎΠ½ вСрнСтся Π² Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ послС выполнСния всСх ΠΊΠΎΠΌΠ°Π½Π΄, Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ ΠΏΠΎ Π·Π°ΠΌΠΊΠ½ΡƒΡ‚ΠΎΠΉ Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ, Ρ‡Ρ‚ΠΎ соотвСтствуСт ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ Π·Π°Π΄Π°Ρ‡ΠΈ. 2βƒ£Π˜Π·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ направлСния: Π ΠΎΠ±ΠΎΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ Π½Π° сСвСр (0), восток (1), юг (2), ΠΈΠ»ΠΈ Π·Π°ΠΏΠ°Π΄ (3). Π­Ρ‚ΠΈ направлСния ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² (dx, dy): сСвСр (0, 1), восток (1, 0), юг (0, -1), Π·Π°ΠΏΠ°Π΄ (-1, 0). 3βƒ£ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄: ΠŸΡ€ΠΎΠΉΠ΄ΠΈΡ‚Π΅ ΠΏΠΎ всСм ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌ ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Ρ€ΠΎΠ±ΠΎΡ‚Π° ΠΈ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ двиТСтся. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° состояния Ρ€ΠΎΠ±ΠΎΡ‚Π°: ПослС выполнСния всСх ΠΊΠΎΠΌΠ°Π½Π΄ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, вСрнулся Π»ΠΈ Ρ€ΠΎΠ±ΠΎΡ‚ Π² Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ (0, 0) ΠΈΠ»ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ» Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅. Если ΠΎΠ΄Π½ΠΎ ΠΈΠ· этих условий Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ, Ρ€ΠΎΠ±ΠΎΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ ΠΏΠΎ Π·Π°ΠΌΠΊΠ½ΡƒΡ‚ΠΎΠΉ Ρ‚Ρ€Π°Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ. 😎 РСшСниС:
class Solution {
public:
    bool isRobotBounded(string instructions) {
        vector<vector<int>> directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
        int x = 0, y = 0, direction = 0;
        
        for (char instruction : instructions) {
            if (instruction == 'G') {
                x += directions[direction][0];
                y += directions[direction][1];
            } else if (instruction == 'L') {
                direction = (direction + 3) % 4;
            } else if (instruction == 'R') {
                direction = (direction + 1) % 4;
            }
        }
        
        return (x == 0 && y == 0) || direction != 0;
    }
};
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ