uz
Feedback
C# | LeetCode

C# | LeetCode

Kanalga Telegram’da oβ€˜tish

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

Ko'proq ko'rsatish
3 201
Obunachilar
-224 soatlar
-67 kunlar
-3430 kunlar
Postlar arxiv
#medium Π—Π°Π΄Π°Ρ‡Π°: 654. Maximum Binary Tree Π’Π°ΠΌ Π΄Π°Π½ цСлочислСнный массив nums Π±Π΅Π· Π΄ΡƒΠ±Π»ΠΈΠΊΠ°Ρ‚ΠΎΠ². Из nums ΠΌΠΎΠΆΠ½ΠΎ рСкурсивно ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ максимальноС Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ: создайтС ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΡƒΠ·Π΅Π», Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ€Π°Π²Π½ΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ Π² nums. РСкурсивно постройтС Π»Π΅Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΏΠΎ прСфиксу подмассива слСва ΠΎΡ‚ максимального значСния. РСкурсивно постройтС ΠΏΡ€Π°Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΏΠΎ суффиксу подмассива справа ΠΎΡ‚ максимального значСния. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ максимальноС Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ, построСнноС ΠΈΠ· nums. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: nums = [3,2,1,6,0,5]
Output: [6,3,5,null,2,0,null,null,1]
πŸ‘¨β€πŸ’» Алгоритм: 1⃣НайдитС максимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ подмассивС ΠΈ создайтС ΡƒΠ·Π΅Π» с этим Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ. 2⃣РСкурсивно постройтС Π»Π΅Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ для подмассива слСва ΠΎΡ‚ максимального значСния. 3⃣РСкурсивно постройтС ΠΏΡ€Π°Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ для подмассива справа ΠΎΡ‚ максимального значСния. 😎 РСшСниС:
public class TreeNode {
    public int val;
    public TreeNode left;
    public TreeNode right;
    public TreeNode(int val = 0, TreeNode left = null, TreeNode right = null) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}

public class Solution {
    public TreeNode ConstructMaximumBinaryTree(int[] nums) {
        return Build(nums, 0, nums.Length);
    }

    private TreeNode Build(int[] nums, int l, int r) {
        if (l == r) return null;
        int maxIndex = Max(nums, l, r);
        TreeNode root = new TreeNode(nums[maxIndex]);
        root.left = Build(nums, l, maxIndex);
        root.right = Build(nums, maxIndex + 1, r);
        return root;
    }

    private int Max(int[] nums, int l, int r) {
        int maxIndex = l;
        for (int i = l + 1; i < r; i++) {
            if (nums[i] > nums[maxIndex]) {
                maxIndex = i;
            }
        }
        return maxIndex;
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

#medium Π—Π°Π΄Π°Ρ‡Π°: 655. Print Binary Tree Учитывая ΠΊΠΎΡ€Π΅Π½ΡŒ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π°, постройтС ΡΡ‚Ρ€ΠΎΠΊΠΎΠ²ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ res с индСксом 0 Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ m x n, которая прСдставляСт собой Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ раскладку Π΄Π΅Ρ€Π΅Π²Π°. Ѐорматированная ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ построСна ΠΏΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ: высота Π΄Π΅Ρ€Π΅Π²Π° Ρ€Π°Π²Π½Π° height, количСство строк m Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π½ΠΎ height + 1. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ столбцов n Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π½ΠΎ 2height+1 - 1. ΠŸΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚Π΅ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΡƒΠ·Π΅Π» Π² сСрСдину Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ строки (Π±ΠΎΠ»Π΅Π΅ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ res[0][(n-1)/2]). Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡƒΠ·Π»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ res[r][c], помСститС Π΅Π³ΠΎ Π»Π΅Π²ΠΎΠ³ΠΎ Ρ€Π΅Π±Π΅Π½ΠΊΠ° Π² res[r+1][c-2height-r-1], Π° ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ - Π² res[r+1][c+2height-r-1]. ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΠΉΡ‚Π΅ этот процСсс, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Ρ‹ всС ΡƒΠ·Π»Ρ‹ Π΄Π΅Ρ€Π΅Π²Π°. Π›ΡŽΠ±Ρ‹Π΅ пустыС ячСйки Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΡƒΡΡ‚ΡƒΡŽ строку "". Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ ΠΏΠΎΡΡ‚Ρ€ΠΎΠ΅Π½Π½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ res. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: root = [1,2]
Output: 
[["","1",""],
 ["2","",""]]
πŸ‘¨β€πŸ’» Алгоритм: 1⃣НайдитС высоту Π΄Π΅Ρ€Π΅Π²Π° ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ (m x n). 2⃣РСкурсивно размСститС ΡƒΠ·Π»Ρ‹ Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅, начиная с ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ ΡƒΠ·Π»Π°. 3⃣ВСрнитС Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ. 😎 РСшСниС:
public class TreeNode {
    public int val;
    public TreeNode left;
    public TreeNode right;
    public TreeNode(int val = 0, TreeNode left = null, TreeNode right = null) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}

public class Solution {
    private int FindHeight(TreeNode root) {
        if (root == null) return -1;
        return 1 + Math.Max(FindHeight(root.left), FindHeight(root.right));
    }

    private void Fill(string[,] res, TreeNode root, int r, int c, int height) {
        if (root == null) return;
        res[r, c] = root.val.ToString();
        if (root.left != null) {
            Fill(res, root.left, r + 1, c - (1 << (height - r - 1)), height);
        }
        if (root.right != null) {
            Fill(res, root.right, r + 1, c + (1 << (height - r - 1)), height);
        }
    }

    public IList<IList<string>> PrintTree(TreeNode root) {
        int height = FindHeight(root);
        int m = height + 1;
        int n = (1 << (height + 1)) - 1;
        string[,] res = new string[m, n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                res[i, j] = "";
            }
        }
        Fill(res, root, 0, (n - 1) / 2, height);
        IList<IList<string>> result = new List<IList<string>>();
        for (int i = 0; i < m; i++) {
            IList<string> row = new List<string>();
            for (int j = 0; j < n; j++) {
                row.Add(res[i, j]);
            }
            result.Add(row);
        }
        return result;
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

#hard Π—Π°Π΄Π°Ρ‡Π°: 656. Coin Path Π’Π°ΠΌ Π΄Π°Π½ цСлочислСнный массив ΠΌΠΎΠ½Π΅Ρ‚ (1-индСксированный) Π΄Π»ΠΈΠ½Ρ‹ n ΠΈ Ρ†Π΅Π»ΠΎΠ΅ число maxJump. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° любой индСкс i массива coins, Ссли coins[i] != -1 ΠΈ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ coins[i] ΠΏΡ€ΠΈ посСщСнии индСкса i. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ссли Π²Ρ‹ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ΡΡŒ Π½Π° индСксС i, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° любой индСкс i + k, Π³Π΄Π΅ i + k <= n ΠΈ k - Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ [1, maxJump]. Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π²Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ΡΡŒ Π½Π° индСксС 1 (coins[1] Π½Π΅ -1). Π’Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ ΠΏΡƒΡ‚ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ достигнСт индСкса n с минимальной ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΡŽ. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ цСлочислСнный массив индСксов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ посСтитС Π² Ρ‚Π°ΠΊΠΎΠΌ порядкС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ индСкса n с минимальной ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΡŽ. Если сущСствуСт нСсколько ΠΏΡƒΡ‚Π΅ΠΉ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΡŽ, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ лСксикографичСски наимСньший Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡƒΡ‚ΡŒ. Если Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ индСкса n, возвращаСтся пустой массив. ΠŸΡƒΡ‚ΡŒ p1 = [Pa1, Pa2, ..., Pax] Π΄Π»ΠΈΠ½Ρ‹ x лСксикографичСски мСньшС, Ρ‡Π΅ΠΌ p2 = [Pb1, Pb2, ..., Pbx] Π΄Π»ΠΈΠ½Ρ‹ y, Ссли ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ j, Π³Π΄Π΅ Paj ΠΈ Pbj ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ, Paj < Pbj; Ссли Ρ‚Π°ΠΊΠΎΠ³ΠΎ j Π½Π΅Ρ‚, Ρ‚ΠΎ x < y. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: coins = [1,2,4,-1,2], maxJump = 2
Output: [1,3,5]
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ динамичСскоС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для нахоТдСния минимальной стоимости Π΄ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ индСкса, начиная с ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ. 2⃣Π₯Ρ€Π°Π½ΠΈΡ‚Π΅ ΠΏΡƒΡ‚ΡŒ Π΄ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ индСкса для отслСТивания наимСньшСго лСксикографичСского ΠΏΡƒΡ‚ΠΈ. 3βƒ£Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, восстановитС ΠΏΡƒΡ‚ΡŒ с минимальной ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΡŽ Π΄ΠΎ послСднСго индСкса. 😎 РСшСниС:
using System;
using System.Collections.Generic;

public class Solution {
    public List<int> MinCostPath(int[] coins, int maxJump) {
        int n = coins.Length;
        if (coins[0] == -1) return new List<int>();
        
        int[] dp = new int[n];
        Array.Fill(dp, int.MaxValue);
        dp[0] = coins[0];
        List<int>[] path = new List<int>[n];
        for (int i = 0; i < n; i++) path[i] = new List<int>();
        path[0].Add(1);
        
        PriorityQueue<(int cost, int index), int> heap = new PriorityQueue<(int, int), int>();
        heap.Enqueue((coins[0], 0), coins[0]);
        
        while (heap.Count > 0) {
            var (currentCost, i) = heap.Dequeue();
            if (currentCost > dp[i]) continue;
            for (int k = 1; k <= maxJump; k++) {
                if (i + k < n && coins[i + k] != -1) {
                    int newCost = currentCost + coins[i + k];
                    if (newCost < dp[i + k] || (newCost == dp[i + k] && ComparePaths(path[i], path[i + k], i + k + 1))) {
                        dp[i + k] = newCost;
                        path[i + k] = new List<int>(path[i]);
                        path[i + k].Add(i + k + 1);
                        heap.Enqueue((newCost, i + k), newCost);
                    }
                }
            }
        }
        
        return dp[n - 1] == int.MaxValue ? new List<int>() : path[n - 1];
    }

    private bool ComparePaths(List<int> path1, List<int> path2, int newIndex) {
        List<int> newPath1 = new List<int>(path1);
        newPath1.Add(newIndex);
        return string.Join(",", newPath1).CompareTo(string.Join(",", path2)) < 0;
    }

    public static void Main(string[] args) {
        Solution solution = new Solution();
        int[] coins = { 0, 2, 4, -1, 2, 5 };
        int maxJump = 2;
        var result = solution.MinCostPath(coins, maxJump);
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

#medium Π—Π°Π΄Π°Ρ‡Π°: 646. Maximum Length of Pair Chain Π’Π°ΠΌ Π΄Π°Π½ массив ΠΈΠ· n ΠΏΠ°Ρ€, Π³Π΄Π΅ pairs[i] = [lefti, righti] ΠΈ lefti < righti. ΠŸΠ°Ρ€Π° p2 = [c, d] слСдуСт Π·Π° ΠΏΠ°Ρ€ΠΎΠΉ p1 = [a, b], Ссли b < c. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ ΠΏΠ°Ρ€. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ ΡΠ°ΠΌΡƒΡŽ Π΄Π»ΠΈΠ½Π½ΡƒΡŽ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ. Π’Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Ρ‹. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Ρ‹ Π² любом порядкС. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: nums = [1,2,2,4]
Output: [2,3]
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£ΠžΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΠ°Ρ€Ρ‹ ΠΏΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌΡƒ элСмСнту ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ°Ρ€Ρ‹ (righti). 2βƒ£Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ динамичСскоС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΆΠ°Π΄Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ максимальной Π΄Π»ΠΈΠ½Ρ‹. 3βƒ£ΠŸΠ΅Ρ€Π΅Π±Π΅Ρ€ΠΈΡ‚Π΅ отсортированныС ΠΏΠ°Ρ€Ρ‹ ΠΈ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΠ°Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Π° Π·Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ, увСличивая Π΄Π»ΠΈΠ½Ρƒ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ. 😎 РСшСниС:
public class Solution {
    public int FindLongestChain(int[][] pairs) {
        Array.Sort(pairs, (a, b) => a[1] - b[1]);
        int currentEnd = int.MinValue;
        int count = 0;
        foreach (var pair in pairs) {
            if (currentEnd < pair[0]) {
                currentEnd = pair[1];
                count++;
            }
        }
        return count;
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

#easy Π—Π°Π΄Π°Ρ‡Π°: 645. Set Mismatch Π£ вас Π΅ΡΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ Ρ†Π΅Π»Ρ‹Ρ… чисСл s, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ содСрТит всС числа ΠΎΡ‚ 1 Π΄ΠΎ n. К соТалСнию, ΠΈΠ·-Π·Π° ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ошибки ΠΎΠ΄Π½ΠΎ ΠΈΠ· чисСл Π² s ΠΏΡ€ΠΎΠ΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π»ΠΎΡΡŒ Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅ число Π² Π½Π°Π±ΠΎΡ€Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ ΠΊ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΡŽ ΠΎΠ΄Π½ΠΎΠ³ΠΎ числа ΠΈ ΠΏΠΎΡ‚Π΅Ρ€Π΅ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ. Π’Π°ΠΌ Π΄Π°Π½ цСлочислСнный массив nums, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ состояниС Π΄Π°Π½Π½Ρ‹Ρ… Π² этом Π½Π°Π±ΠΎΡ€Π΅ послС ошибки. НайдитС число, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ встрСчаСтся Π΄Π²Π°ΠΆΠ΄Ρ‹, ΠΈ число, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ отсутствуСт, ΠΈ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ ΠΈΡ… Π² Π²ΠΈΠ΄Π΅ массива. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: nums = [1,2,2,4]
Output: [2,3]
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£ΠŸΡ€ΠΎΠΉΠ΄ΠΈΡ‚Π΅ ΠΏΠΎ массиву, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π½Π°Π±ΠΎΡ€ для отслСТивания чисСл, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ число. 2βƒ£ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ число, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ сумму чисСл ΠΎΡ‚ 1 Π΄ΠΎ n ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ сумму массива. 3⃣ВСрнитС Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΈ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ числа Π² Π²ΠΈΠ΄Π΅ массива. 😎 РСшСниС:
public class Solution {
    public int[] FindErrorNums(int[] nums) {
        int n = nums.Length;
        HashSet<int> numSet = new HashSet<int>();
        int duplicate = -1;
        foreach (int num in nums) {
            if (!numSet.Add(num)) {
                duplicate = num;
            }
        }
        int missing = (n * (n + 1)) / 2 - numSet.Sum();
        return new int[] { duplicate, missing };
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

– ΠŸΠΎΠΌΠΎΡ‰ΡŒ с pet-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ – БоставлСниС roadmap – ΠžΠ±Ρ‰Π°Ρ ΠΊΠΎΠ½ΡΡƒΠ»ΡŒΡ‚Π°Ρ†ΠΈΡ – ΠŸΡ€ΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄-Ρ€Π΅Π²ΡŒΡŽ ΠΈ mock-собСсСдования – ΠŸΠΎΠΌΠΎΡ‰ΡŒ с Ρ‚Ρ€Ρƒ
– ΠŸΠΎΠΌΠΎΡ‰ΡŒ с pet-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ – БоставлСниС roadmap – ΠžΠ±Ρ‰Π°Ρ ΠΊΠΎΠ½ΡΡƒΠ»ΡŒΡ‚Π°Ρ†ΠΈΡ – ΠŸΡ€ΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄-Ρ€Π΅Π²ΡŒΡŽ ΠΈ mock-собСсСдования – ΠŸΠΎΠΌΠΎΡ‰ΡŒ с трудоустройством ВсС это ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠœΠ΅Π½Ρ‚ΠΎΡ€. Он обСспСчит Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ boost, ускорит ΠΈ упростит Π²Ρ…ΠΎΠ΄ Π² IT. πŸ”₯ Π—Π΄Π΅ΡΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ список ΠΌΠ΅Π½Ρ‚ΠΎΡ€ΠΎΠ², ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· Π½ΠΈΡ… ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ Π±Π΅ΡΠΏΠ»Π°Ρ‚Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΊΠΎΠ½ΡΡƒΠ»ΡŒΡ‚Π°Ρ†ΠΈΡŽ

#hard Π—Π°Π΄Π°Ρ‡Π°: 644. Maximum Average Subarray II Π’Π°ΠΌ Π΄Π°Π½ цСлочислСнный массив nums, состоящий ΠΈΠ· n элСмСнтов, ΠΈ Ρ†Π΅Π»ΠΎΠ΅ число k. НайдитС смСТный подмассив, Π΄Π»ΠΈΠ½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ большС ΠΈΠ»ΠΈ Ρ€Π°Π²Π½Π° k ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ максимальноС срСднСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΈ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ΡΡ любой ΠΎΡ‚Π²Π΅Ρ‚ с ΠΏΠΎΠ³Ρ€Π΅ΡˆΠ½ΠΎΡΡ‚ΡŒΡŽ вычислСний ΠΌΠ΅Π½Π΅Π΅ 10-5. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: nums = [1,12,-5,-6,50,3], k = 4
Output: 12.75000
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡΠΊΠΎΠ»ΡŒΠ·ΡΡ‰Π΅Π΅ ΠΎΠΊΠ½ΠΎ Π΄Π»ΠΈΠ½Ρ‹ k для нахоТдСния Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ срСднСго значСния. 2βƒ£ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΠΉΡ‚Π΅ ΠΎΠΊΠ½ΠΎ ΠΏΠΎ массиву, добавляя ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт ΠΈ убирая ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ, обновляя Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ срСднСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. 3⃣БлСдитС Π·Π° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ срСдним Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΈ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ Π΅Π³ΠΎ послС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΎΠΊΠΎΠ½. 😎 РСшСниС:
public class Solution {
    public double FindMaxAverage(int[] nums, int k) {
        int currSum = nums.Take(k).Sum();
        int maxSum = currSum;
        for (int i = k; i < nums.Length; i++) {
            currSum += nums[i] - nums[i - k];
            if (currSum > maxSum) {
                maxSum = currSum;
            }
        }
        return (double)maxSum / k;
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

#easy Π—Π°Π΄Π°Ρ‡Π°: 643. Maximum Average Subarray I Π’Π°ΠΌ Π΄Π°Π½ цСлочислСнный массив nums, состоящий ΠΈΠ· n элСмСнтов, ΠΈ Ρ†Π΅Π»ΠΎΠ΅ число k. НайдитС смСТный подмассив, Π΄Π»ΠΈΠ½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ€Π°Π²Π½Π° k ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ максимальноС срСднСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΈ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ΡΡ любой ΠΎΡ‚Π²Π΅Ρ‚ с ΠΏΠΎΠ³Ρ€Π΅ΡˆΠ½ΠΎΡΡ‚ΡŒΡŽ вычислСний ΠΌΠ΅Π½Π΅Π΅ 10-5. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: nums = [1,12,-5,-6,50,3], k = 4
Output: 12.75000
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΡΠΊΠΎΠ»ΡŒΠ·ΡΡ‰Π΅Π³ΠΎ ΠΎΠΊΠ½Π° ВычислитС сумму ΠΏΠ΅Ρ€Π²Ρ‹Ρ… k элСмСнтов массива nums. Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ максимальной суммы. 2βƒ£ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΠΊΠ½Π° ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΠΉΡ‚Π΅ ΠΎΠΊΠ½ΠΎ Π΄Π»ΠΈΠ½ΠΎΠΉ k ΠΏΠΎ массиву, добавляя ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт ΠΈ убирая ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ сумму Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΎΠΊΠ½Π°. 3βƒ£ΠžΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ максимальной суммы На ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС обновляйтС ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ сумму, Ссли тСкущая сумма большС, ΠΈ Π² ΠΊΠΎΠ½Ρ†Π΅ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ срСднСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этой суммы. 😎 РСшСниС:
public class Solution {
    public double FindMaxAverage(int[] nums, int k) {
        int currentSum = 0;
        for (int i = 0; i < k; i++) {
            currentSum += nums[i];
        }
        int maxSum = currentSum;
        
        for (int i = k; i < nums.Length; i++) {
            currentSum += nums[i] - nums[i - k];
            maxSum = Math.Max(maxSum, currentSum);
        }
        
        return (double)maxSum / k;
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

#hard Π—Π°Π΄Π°Ρ‡Π°: 568. Maximum Vacation Days LeetCode Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· своих Π»ΡƒΡ‡ΡˆΠΈΡ… сотрудников Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ n Π³ΠΎΡ€ΠΎΠ΄Π°ΠΌ для сбора Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°ΠΌ. Однако, ΠΊΠ°ΠΊ говорится, "Π΄Π΅Π»Ρƒ врСмя, ΠΏΠΎΡ‚Π΅Ρ…Π΅ час". Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π±Ρ€Π°Ρ‚ΡŒ отпуска Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Π³ΠΎΡ€ΠΎΠ΄Π°Ρ… ΠΈ нСдСлях. Π’Π°ΡˆΠ° Π·Π°Π΄Π°Ρ‡Π° β€” ΡΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΅Π·Π΄ΠΊΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ максимально ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ количСство Π΄Π½Π΅ΠΉ отпуска, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ смоТСтС Π²Π·ΡΡ‚ΡŒ, соблюдая ΠΏΡ€ΠΈ этом ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈ ограничСния. ΠŸΡ€Π°Π²ΠΈΠ»Π° ΠΈ ограничСния: Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠ΅ΠΆΠ΄Ρƒ n Π³ΠΎΡ€ΠΎΠ΄Π°ΠΌΠΈ, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΌΠΈ индСксами ΠΎΡ‚ 0 Π΄ΠΎ n-1. Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π²Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ΡΡŒ Π² Π³ΠΎΡ€ΠΎΠ΄Π΅ с индСксом 0 Π² понСдСльник. Π“ΠΎΡ€ΠΎΠ΄Π° связаны рСйсами. РСйсы прСдставлСны ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ΠΉ n x n, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ flights, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ статус Π°Π²ΠΈΠ°Π»ΠΈΠ½ΠΈΠΈ ΠΎΡ‚ Π³ΠΎΡ€ΠΎΠ΄Π° i Π΄ΠΎ Π³ΠΎΡ€ΠΎΠ΄Π° j. Если рСйса ΠΈΠ· Π³ΠΎΡ€ΠΎΠ΄Π° i Π² Π³ΠΎΡ€ΠΎΠ΄ j Π½Π΅Ρ‚, flights[i][j] == 0; ΠΈΠ½Π°Ρ‡Π΅ flights[i][j] == 1. Π’Π°ΠΊΠΆΠ΅ для всСх i выполняСтся flights[i][i] == 0. Π£ вас Π΅ΡΡ‚ΡŒ k нСдСль (каТдая нСдСля состоит ΠΈΠ· сСми Π΄Π½Π΅ΠΉ) для ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΈΠΉ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π»Π΅Ρ‚Π°Ρ‚ΡŒ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π° Π² дСнь ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π»Π΅Ρ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΡ‚Ρ€ΠΎΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ понСдСльника. ВрСмя ΠΏΠΎΠ»Π΅Ρ‚Π° Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ΅, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ влияниС Π½Π΅ учитываСтся. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π³ΠΎΡ€ΠΎΠ΄Π° Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹Π΅ Π΄Π½ΠΈ отпуска Π² Ρ€Π°Π·Π½Ρ‹Π΅ Π½Π΅Π΄Π΅Π»ΠΈ, Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ΠΉ n x k, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ days. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ days[i][j] прСдставляСт максимальноС количСство Π΄Π½Π΅ΠΉ отпуска, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Π·ΡΡ‚ΡŒ Π² Π³ΠΎΡ€ΠΎΠ΄Π΅ i Π½Π° Π½Π΅Π΄Π΅Π»Π΅ j. Π”Π°Π½Ρ‹ Π΄Π²Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ flights ΠΈ days, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ максимальноС количСство Π΄Π½Π΅ΠΉ отпуска, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Π·ΡΡ‚ΡŒ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ k нСдСль. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: flights = [[0,1,1],[1,0,1],[1,1,0]], days = [[1,3,1],[6,0,3],[3,3,3]]
Output: 12
Explanation:
One of the best strategies is:
1st week : fly from city 0 to city 1 on Monday, and play 6 days and work 1 day.
(Although you start at city 0, we could also fly to and start at other cities since it is Monday.)
2nd week : fly from city 1 to city 2 on Monday, and play 3 days and work 4 days.
3rd week : stay at city 2, and play 3 days and work 4 days.
Ans = 6 + 3 + 3 = 12.
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ dfs (поиск Π² Π³Π»ΡƒΠ±ΠΈΠ½Ρƒ), которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ количСство отпускных Π΄Π½Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡ‚ΡŒ, начиная с Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π³ΠΎΡ€ΠΎΠ΄Π° cur_city ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π½Π΅Π΄Π΅Π»ΠΈ weekno. Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠΎ всСм Π³ΠΎΡ€ΠΎΠ΄Π°ΠΌ ΠΈ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ всС Π³ΠΎΡ€ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ связаны с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ Π³ΠΎΡ€ΠΎΠ΄ΠΎΠΌ. Π’Π°ΠΊΠΎΠΉ Π³ΠΎΡ€ΠΎΠ΄ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ 1 Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ flights[cur_city][i]. 2⃣Для Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π³ΠΎΡ€ΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈΠ±ΠΎ ΠΎΡΡ‚Π°Ρ‚ΡŒΡΡ Π² Π½Π΅ΠΌ, Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ΅Ρ…Π°Ρ‚ΡŒ Π² связанный Π³ΠΎΡ€ΠΎΠ΄. ΠžΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΠΌ Π³ΠΎΡ€ΠΎΠ΄, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ мСняСтся располоТСниС, ΠΊΠ°ΠΊ j. ПослС смСны Π³ΠΎΡ€ΠΎΠ΄Π° Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ количСство отпускных Π΄Π½Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡ‚ΡŒ, начиная с Π½ΠΎΠ²ΠΎΠ³ΠΎ Π³ΠΎΡ€ΠΎΠ΄Π° ΠΈ с Π½ΠΎΠ²ΠΎΠΉ Π½Π΅Π΄Π΅Π»ΠΈ. Π­Ρ‚ΠΎ количСство отпускных Π΄Π½Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ: days[j][weekno] + dfs(flights, days, j, weekno + 1). 3⃣Для Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π³ΠΎΡ€ΠΎΠ΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΠΉΡ‚ΠΈ максимальноС количСство отпускных Π΄Π½Π΅ΠΉ, выбирая Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π³ΠΎΡ€ΠΎΠ΄Π° Π² качСствС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ мСстополоТСния. Из всСх Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² отпускных Π΄Π½Π΅ΠΉ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ максимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ dfs. 😎 РСшСниС:
public class Solution {
    public int MaxVacationDays(int[][] flights, int[][] days) {
        int n = flights.Length, k = days[0].Length;
        int[][] memo = new int[n][];
        for (int i = 0; i < n; i++) {
            memo[i] = new int[k];
            Array.Fill(memo[i], -1);
        }
        return Dfs(flights, days, memo, 0, 0);
    }

    private int Dfs(int[][] flights, int[][] days, int[][] memo, int curCity, int weekNo) {
        int n = flights.Length, k = days[0].Length;
        if (weekNo == k) return 0;
        if (memo[curCity][weekNo] != -1) return memo[curCity][weekNo];
        int maxVac = 0;
        for (int nextCity = 0; nextCity < n; nextCity++) {
            if (curCity == nextCity || flights[curCity][nextCity] == 1) {
                maxVac = Math.Max(maxVac, days[nextCity][weekNo] + Dfs(flights, days, memo, nextCity, weekNo + 1));
            }
        }
        memo[curCity][weekNo] = maxVac;
        return maxVac;
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

πŸ“Ί Уникальная Π±Π°Π·Π° IT собСсСдований 370+ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… собСсСдований Π½Π° программиста, тСстировщика, Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠ° ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ IT ΠΏΡ€ΠΎΡ„Ρ‹. Π•
πŸ“Ί Уникальная Π±Π°Π·Π° IT собСсСдований 370+ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… собСсСдований Π½Π° программиста, тСстировщика, Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠ° ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ IT ΠΏΡ€ΠΎΡ„Ρ‹. Π•ΡΡ‚ΡŒ собСсы ΠΎΡ‚ Π²Π΅Π΄ΡƒΡ‰ΠΈΡ… ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΉ: Π‘Π±Π΅Ρ€, ЯндСкс, Π’Π’Π‘, Π’ΠΈΠ½ΡŒΠΊΠΎΡ„Ρ„, Озон, Wildberries ΠΈ Ρ‚.Π΄. 🎯 ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈ ΠΏΠΎ ссылкС ΠΈ присоСдиняйся ΠΊ Π±Π°Π·Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠΊΠ°Ρ‡Π°Ρ‚ΡŒ свои ΡˆΠ°Π½ΡΡ‹ Π½Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ трудоустройство!

#medium Π—Π°Π΄Π°Ρ‡Π°: 641. Design Circular Deque Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°ΠΉΡ‚Π΅ свою Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΊΡ€ΡƒΠ³ΠΎΠ²ΠΎΠΉ двустороннСй ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ (deque). Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ класс MyCircularDeque: MyCircularDeque(int k) Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ deque с ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ k. boolean insertFront() ДобавляСт элСмСнт Π² ΠΏΠ΅Ρ€Π΅Π΄Π½ΡŽΡŽ Ρ‡Π°ΡΡ‚ΡŒ Deque. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, Ссли опСрация ΠΏΡ€ΠΎΡˆΠ»Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, ΠΈΠ»ΠΈ false Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС. boolean insertLast() ДобавляСт элСмСнт Π² заднюю Ρ‡Π°ΡΡ‚ΡŒ Deque. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, Ссли опСрация Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, ΠΈΠ»ΠΈ false Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС. boolean deleteFront() УдаляСт элСмСнт ΠΈΠ· ΠΏΠ΅Ρ€Π΅Π΄Π½Π΅ΠΉ части Deque. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, Ссли опСрация ΠΏΡ€ΠΎΡˆΠ»Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, ΠΈΠ»ΠΈ false Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС. boolean deleteLast() УдаляСт элСмСнт ΠΈΠ· Π·Π°Π΄Π½Π΅ΠΉ части Deque. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, Ссли опСрация ΠΏΡ€ΠΎΡˆΠ»Π° ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, ΠΈΠ»ΠΈ false Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС. int getFront() Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π½ΠΈΠΉ элСмСнт ΠΈΠ· Deque. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ -1, Ссли Deque пуст. int getRear() Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ послСдний элСмСнт ΠΈΠ· Deque. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ -1, Ссли Deque пуст. boolean isEmpty() Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, Ссли Deque пуст, ΠΈΠ»ΠΈ false Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС. boolean isFull() Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, Ссли Deque ΠΏΠΎΠ»ΠΎΠ½, ΠΈΠ»ΠΈ false Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input
["MyCircularDeque", "insertLast", "insertLast", "insertFront", "insertFront", "getRear", "isFull", "deleteLast", "insertFront", "getFront"]
[[3], [1], [2], [3], [4], [], [], [], [4], []]
Output
[null, true, true, true, false, 2, true, true, true, 4]
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° состояний Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ конструктор для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ»ΡŒΡ†Π΅Π²ΠΎΠΉ двустороннСй ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ пустоты ΠΈ ΠΏΠΎΠ»Π½ΠΎΡ‚Ρ‹ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. 2βƒ£ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ вставки Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ вставки элСмСнтов Π² ΠΏΠ΅Ρ€Π΅Π΄Π½ΡŽΡŽ ΠΈ заднюю части ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ ΠΊΠΎΠ»ΡŒΡ†Π΅Π²ΠΎΠΉ структуры. 3βƒ£ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ удалСния Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ удалСния элСмСнтов ΠΈΠ· ΠΏΠ΅Ρ€Π΅Π΄Π½Π΅ΠΉ ΠΈ Π·Π°Π΄Π½Π΅ΠΉ частСй ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ ΠΊΠΎΠ»ΡŒΡ†Π΅Π²ΠΎΠΉ структуры ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для получСния ΠΏΠ΅Ρ€Π΅Π΄Π½Π΅Π³ΠΎ ΠΈ Π·Π°Π΄Π½Π΅Π³ΠΎ элСмСнтов ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. 😎 РСшСниС:
public class MyCircularDeque {
    private int[] deque;
    private int front;
    private int rear;
    private int size;
    private int capacity;

    public MyCircularDeque(int k) {
        capacity = k;
        deque = new int[k];
        front = 0;
        rear = 0;
        size = 0;
    }

    public bool InsertFront(int value) {
        if (IsFull()) return false;
        front = (front - 1 + capacity) % capacity;
        deque[front] = value;
        size++;
        return true;
    }

    public bool InsertLast(int value) {
        if (IsFull()) return false;
        deque[rear] = value;
        rear = (rear + 1) % capacity;
        size++;
        return true;
    }

    public bool DeleteFront() {
        if (IsEmpty()) return false;
        front = (front + 1) % capacity;
        size--;
        return true;
    }

    public bool DeleteLast() {
        if (IsEmpty()) return false;
        rear = (rear - 1 + capacity) % capacity;
        size--;
        return true;
    }

    public int GetFront() {
        if (IsEmpty()) return -1;
        return deque[front];
    }

    public int GetRear() {
        if (IsEmpty()) return -1;
        return deque[(rear - 1 + capacity) % capacity];
    }

    public bool IsEmpty() {
        return size == 0;
    }

    public bool IsFull() {
        return size == capacity;
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

#medium Π—Π°Π΄Π°Ρ‡Π°: 567. Permutation in String Π”Π°Π½Ρ‹ Π΄Π²Π΅ строки 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. 😎 РСшСниС:
public class Solution {
    public bool CheckInclusion(string s1, string s2) {
        int s1Len = s1.Length, s2Len = s2.Length;
        if (s1Len > s2Len) return false;
        
        int[] s1Count = new int[26];
        int[] s2Count = new int[26];
        
        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.SequenceEqual(s2Count)) return true;
            s2Count[s2[i] - 'a']--;
            s2Count[s2[i + s1Len] - 'a']++;
        }
        
        return s1Count.SequenceEqual(s2Count);
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

#easy Π—Π°Π΄Π°Ρ‡Π°: 566. Reshape the Matrix Π’ MATLAB Π΅ΡΡ‚ΡŒ удобная функция ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ reshape, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ m x n Π² Π½ΠΎΠ²ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ с Π΄Ρ€ΡƒΠ³ΠΈΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ r x c, сохраняя исходныС Π΄Π°Π½Π½Ρ‹Π΅. Π’Π°ΠΌ Π΄Π°Π½Π° ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° m x n mat ΠΈ Π΄Π²Π° Ρ†Π΅Π»Ρ‹Ρ… числа r ΠΈ c, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ количСство строк ΠΈ столбцов ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠΉ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹. ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½Π°Ρ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π° всСми элСмСнтами исходной ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ порядкС ΠΎΠ±Ρ…ΠΎΠ΄Π° строк, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ. Если опСрация прСобразования с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΠΈ допустима, Π²Ρ‹Π²Π΅Π΄ΠΈΡ‚Π΅ Π½ΠΎΠ²ΡƒΡŽ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ; Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π²Ρ‹Π²Π΅Π΄ΠΈΡ‚Π΅ ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: mat = [[1,2],[3,4]], r = 1, c = 4
Output: [[1,2,3,4]]
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ r ΠΈ c. Π­Ρ‚ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ссли ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ m * n Ρ€Π°Π²Π½ΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡŽ r * c. Если ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ. 2βƒ£Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ массив для хранСния ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹. ΠŸΠ΅Ρ€Π΅Π±Ρ€Π°Ρ‚ΡŒ всС элСмСнты исходной ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΈ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈΡ… Π² Π½ΠΎΠ²Ρ‹ΠΉ массив Π² порядкС ΠΎΠ±Ρ…ΠΎΠ΄Π° строк. 3βƒ£Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ, Ссли ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈΠ½Π°Ρ‡Π΅ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ. 😎 РСшСниС:
public class Solution {
    public int[][] MatrixReshape(int[][] mat, int r, int c) {
        int m = mat.Length, n = mat[0].Length;
        if (m * n != r * c) {
            return mat;
        }
        int[][] reshapedMatrix = new int[r][];
        for (int i = 0; i < r; i++) {
            reshapedMatrix[i] = new int[c];
        }
        int row = 0, col = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                reshapedMatrix[row][col] = mat[i][j];
                col++;
                if (col == c) {
                    col = 0;
                    row++;
                }
            }
        }
        return reshapedMatrix;
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

#medium Π—Π°Π΄Π°Ρ‡Π°: 640. Solve the Equation Π Π΅ΡˆΠΈΡ‚Π΅ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ ΠΈ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 'x' Π² Π²ΠΈΠ΄Π΅ строки "x=#value". Π£Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ '+', '-', ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ 'x' ΠΈ Π΅Π΅ коэффициСнт. Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ "No solution", Ссли для уравнСния Π½Π΅Ρ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, ΠΈΠ»ΠΈ "Infinite solutions", Ссли для уравнСния сущСствуСт бСсконСчноС количСство Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ. Если для уравнСния сущСствуСт Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄Π½ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΌΡ‹ убСТдаСмся, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 'x' являСтся Ρ†Π΅Π»Ρ‹ΠΌ числом. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: s = "*"
Output: 9
πŸ‘¨β€πŸ’» Алгоритм: 1⃣РаздСлСниС уравнСния Π Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅ ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Π½Π° Π»Π΅Π²ΡƒΡŽ ΠΈ ΠΏΡ€Π°Π²ΡƒΡŽ части ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π½Π°ΠΊΠ° равСнства '='. 2βƒ£ΠŸΠ°Ρ€ΡΠΈΠ½Π³ ΠΈ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠ΅ ΠŸΡ€ΠΎΠΉΠ΄ΠΈΡ‚Π΅ΡΡŒ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ части уравнСния, упрощая Π΅Π΅ Π΄ΠΎ суммы коэффициСнтов 'x' ΠΈ числовых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. 3βƒ£Π Π΅ΡˆΠ΅Π½ΠΈΠ΅ уравнСния Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Π²ΠΈΠ΄Π° ax + b = cx + d, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ для 'x'. Если коэффициСнты 'x' Ρ€Π°Π²Π½Ρ‹ ΠΈ числовыС значСния Ρ€Π°Π²Π½Ρ‹, ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ бСсконСчноС количСство Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ. Если коэффициСнты 'x' Ρ€Π°Π²Π½Ρ‹, Π½ΠΎ числовыС значСния Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹, Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π΅Ρ‚. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС вычислитС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 'x'. 😎 РСшСниС:
using System;
using System.Text.RegularExpressions;

public class Solution {
    public string SolveEquation(string equation) {
        string[] sides = equation.Split('=');
        int[] left = Parse(sides[0]);
        int[] right = Parse(sides[1]);
        
        int coeff = left[0] - right[0];
        int constPart = right[1] - left[1];
        
        if (coeff == 0) {
            return constPart == 0 ? "Infinite solutions" : "No solution";
        }
        return "x=" + (constPart / coeff);
    }

    private int[] Parse(string s) {
        int coeff = 0, constPart = 0, sign = 1, num = 0;
        int i = 0;
        while (i < s.Length) {
            if (s[i] == '+') {
                sign = 1;
                i++;
            } else if (s[i] == '-') {
                sign = -1;
                i++;
            } else if (char.IsDigit(s[i])) {
                num = 0;
                while (i < s.Length && char.IsDigit(s[i])) {
                    num = num * 10 + (s[i] - '0');
                    i++;
                }
                if (i < s.Length && s[i] == 'x') {
                    coeff += sign * num;
                    i++;
                } else {
                    constPart += sign * num;
                }
            } else if (s[i] == 'x') {
                coeff += sign;
                i++;
            }
        }
        return new int[]{coeff, constPart};
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

#hard Π—Π°Π΄Π°Ρ‡Π°: 639. Decode Ways II Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅, содСрТащСС Π±ΡƒΠΊΠ²Ρ‹ ΠΎΡ‚ A-Z, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Π² Ρ†ΠΈΡ„Ρ€Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ отобраТСния: 'A' -> "1" 'B' -> "2" ... 'Z' -> "26" Π§Ρ‚ΠΎΠ±Ρ‹ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ сообщСниС, всС Ρ†ΠΈΡ„Ρ€Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ сгруппированы, Π° Π·Π°Ρ‚Π΅ΠΌ снова ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Ρ‹ Π² Π±ΡƒΠΊΠ²Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ отобраТСния (ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСсколько способов). НапримСр, "11106" ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΎ Π²: "AAJF" с Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ (1 1 10 6) "KJF" с Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ (11 10 6) ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²ΠΊΠ° (1 11 06) Π½Π΅Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ "06" Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΎ Π² "F", Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ "6" отличаСтся ΠΎΡ‚ "06". Π’ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ Π²Ρ‹ΡˆΠ΅ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ прСобразованиям ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ сообщСниС ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ символ "*", ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ Ρ†ΠΈΡ„Ρ€Ρƒ ΠΎΡ‚ "1" Π΄ΠΎ "9" ("0" ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ). НапримСр, ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ сообщСниС "1*" ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ любоС ΠΈΠ· ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… сообщСний "11", "12", "13", "14", "15", "16", "17", "18" ΠΈΠ»ΠΈ "19". Π”Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ "1*" эквивалСнтно Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ любого ΠΈΠ· ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… сообщСний, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ. Если Π·Π°Π΄Π°Π½Π° строка s, состоящая ΠΈΠ· Ρ†ΠΈΡ„Ρ€ ΠΈ символов '*', Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ количСство способов Π΅Π΅ дСкодирования. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΡ‚Π²Π΅Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ большим, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ Π΅Π³ΠΎ ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ 109 + 7. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: s = "*"
Output: 9
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ массив dp, Π³Π΄Π΅ dp[i] прСдставляСт количСство способов дСкодирования подстроки s[0:i]. УстановитС Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ значСния dp[0] = 1 (пустая строка ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ способ дСкодирования). 2βƒ£ΠžΠ±Ρ…ΠΎΠ΄ строки Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ†ΠΈΠΊΠ» для ΠΎΠ±Ρ…ΠΎΠ΄Π° строки ΠΈ вычислСния количСства способов дСкодирования для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ символа, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ символа '*'. 3βƒ£ΠœΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΠ΅ вычислСниС ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ количСство способов дСкодирования ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ большим, вычисляйтС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ 10^9 + 7. 😎 РСшСниС:
using System;

public class Solution {
    public int NumDecodings(string s) {
        const int MOD = 1000000007;
        int n = s.Length;
        long[] dp = new long[n + 1];
        dp[0] = 1;

        for (int i = 1; i <= n; i++) {
            if (s[i - 1] == '*') {
                dp[i] = 9 * dp[i - 1];
            } else if (s[i - 1] != '0') {
                dp[i] = dp[i - 1];
            }

            if (i > 1) {
                if (s[i - 2] == '*') {
                    if (s[i - 1] == '*') {
                        dp[i] += 15 * dp[i - 2];
                    } else if (s[i - 1] <= '6') {
                        dp[i] += 2 * dp[i - 2];
                    } else {
                        dp[i] += dp[i - 2];
                    }
                } else if (s[i - 2] == '1') {
                    if (s[i - 1] == '*') {
                        dp[i] += 9 * dp[i - 2];
                    } else {
                        dp[i] += dp[i - 2];
                    }
                } else if (s[i - 2] == '2') {
                    if (s[i - 1] == '*') {
                        dp[i] += 6 * dp[i - 2];
                    } else if (s[i - 1] <= '6') {
                        dp[i] += dp[i - 2];
                    }
                }
            }

            dp[i] %= MOD;
        }

        return (int)dp[n];
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

#medium Π—Π°Π΄Π°Ρ‡Π°: 638. Shopping Offers Π’ ΠΌΠ°Π³Π°Π·ΠΈΠ½Π΅ LeetCode Store Π΅ΡΡ‚ΡŒ n ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ΠΎΠ² для ΠΏΡ€ΠΎΠ΄Π°ΠΆΠΈ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‚ΠΎΠ²Π°Ρ€ ΠΈΠΌΠ΅Π΅Ρ‚ свою Ρ†Π΅Π½Ρƒ. Однако ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ прСдлоТСния, ΠΈ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ состоит ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π²ΠΈΠ΄ΠΎΠ² Ρ‚ΠΎΠ²Π°Ρ€ΠΎΠ² с распродаТной Ρ†Π΅Π½ΠΎΠΉ. Π’Π°ΠΌ Π΄Π°Π½ цСлочислСнный массив price, Π³Π΄Π΅ price[i] - Ρ†Π΅Π½Π° i-Π³ΠΎ Ρ‚ΠΎΠ²Π°Ρ€Π°, ΠΈ цСлочислСнный массив needs, Π³Π΄Π΅ needs[i] - количСство ΡˆΡ‚ΡƒΠΊ i-Π³ΠΎ Ρ‚ΠΎΠ²Π°Ρ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΊΡƒΠΏΠΈΡ‚ΡŒ. Π’Π°ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ Π΄Π°Π½ массив special, Π³Π΄Π΅ special[i] ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ n + 1, Π³Π΄Π΅ special[i][j] - количСство ΡˆΡ‚ΡƒΠΊ j-Π³ΠΎ Ρ‚ΠΎΠ²Π°Ρ€Π° Π² i-ΠΌ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ, Π° special[i][n] (Ρ‚.Π΅., Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π°ΠΈΠΌΠ΅Π½ΡŒΡˆΡƒΡŽ Ρ†Π΅Π½Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ Π·Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Ρ‚ΠΎΠ²Π°Ρ€ ΠΈΠ· Π·Π°Π΄Π°Π½Π½Ρ‹Ρ…, Π³Π΄Π΅ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ прСдлоТСния. Π’Π°ΠΌ Π½Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΠΏΠΎΠΊΡƒΠΏΠ°Ρ‚ΡŒ большС Ρ‚ΠΎΠ²Π°Ρ€ΠΎΠ², Ρ‡Π΅ΠΌ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Π΄Π°ΠΆΠ΅ Ссли это снизит ΠΎΠ±Ρ‰ΡƒΡŽ Ρ†Π΅Π½Ρƒ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ любоС ΠΈΠ· ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·, сколько Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: price = [2,5], special = [[3,0,5],[1,2,10]], needs = [3,2]
Output: 14
πŸ‘¨β€πŸ’» Алгоритм: 1⃣РСкурсивноС вычислСниС стоимости ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая рСкурсивно вычисляСт ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ для ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ Π½ΡƒΠΆΠ΄, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ динамичСскоС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для запоминания ΡƒΠΆΠ΅ вычислСнных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. 2βƒ£Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ Ρ‚ΠΎΠ²Π°Ρ€ΠΎΠ² Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… прСдлоТСниях, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ это ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±Π΅Π· ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ΠΈΡ Π½ΡƒΠΆΠ΄. Если ΠΌΠΎΠΆΠ½ΠΎ, вычислитС Π½ΠΎΠ²ΡƒΡŽ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ, учитывая это ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅. 3⃣Выбор минимальной стоимости Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈ использовании ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΊΡƒΠΏΠΊΠ΅ Ρ‚ΠΎΠ²Π°Ρ€ΠΎΠ² ΠΏΠΎ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ Ρ†Π΅Π½Π°ΠΌ, выбирая ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ. 😎 РСшСниС:
public class Solution {
    public int ShoppingOffers(IList<int> price, IList<IList<int>> special, IList<int> needs) {
        var memo = new Dictionary<string, int>();
        return Dfs(price, special, needs, memo);
    }

    private int Dfs(IList<int> price, IList<IList<int>> special, IList<int> needs, Dictionary<string, int> memo) {
        string key = Serialize(needs);
        if (memo.ContainsKey(key)) {
            return memo[key];
        }

        int minPrice = 0;
        for (int i = 0; i < needs.Count; i++) {
            minPrice += needs[i] * price[i];
        }

        foreach (var offer in special) {
            var newNeeds = new List<int>();
            bool valid = true;
            for (int i = 0; i < needs.Count; i++) {
                if (needs[i] < offer[i]) {
                    valid = false;
                    break;
                }
                newNeeds.Add(needs[i] - offer[i]);
            }
            if (valid) {
                minPrice = Math.Min(minPrice, offer[needs.Count] + Dfs(price, special, newNeeds, memo));
            }
        }

        memo[key] = minPrice;
        return minPrice;
    }

    private string Serialize(IList<int> needs) {
        return string.Join(",", needs);
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π”Π°Ρ€ΠΈΠΌ подписку Π½Π° ЯндСкс ΠœΡƒΠ·Ρ‹ΠΊΡƒ ΠžΡ‚Π²Π΅Ρ‚ΡŒΡ‚Π΅ Π½Π° 1 вопрос ΠΈ ЯндСкс ΠœΡƒΠ·Ρ‹ΠΊΠ° для вас ΠΈ 3-Ρ… Π²Π°ΡˆΠΈΡ… Π±Π»ΠΈΠ·ΠΊΠΈΡ… 30 Π΄Π½Π΅ΠΉ бСсплатно. Кинопоиск
Π”Π°Ρ€ΠΈΠΌ подписку Π½Π° ЯндСкс ΠœΡƒΠ·Ρ‹ΠΊΡƒ ΠžΡ‚Π²Π΅Ρ‚ΡŒΡ‚Π΅ Π½Π° 1 вопрос ΠΈ ЯндСкс ΠœΡƒΠ·Ρ‹ΠΊΠ° для вас ΠΈ 3-Ρ… Π²Π°ΡˆΠΈΡ… Π±Π»ΠΈΠ·ΠΊΠΈΡ… 30 Π΄Π½Π΅ΠΉ бСсплатно. Кинопоиск ΠΈ ЯндСкс Книги Ρ‚ΠΎΠΆΠ΅ Π² подпискС. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ сСйчас❀️ ΠŸΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ #Ρ€Π΅ΠΊΠ»Π°ΠΌΠ° 18+ music.yandex.ru О Ρ€Π΅ΠΊΠ»Π°ΠΌΠΎΠ΄Π°Ρ‚Π΅Π»Π΅ Π Π΅ΠΊΠ»Π°ΠΌΠ° Π½Π° ЯндСксС

#easy Π—Π°Π΄Π°Ρ‡Π°: 637. Average of Levels in Binary Tree Учитывая ΠΊΠΎΡ€Π΅Π½ΡŒ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π°, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ срСднСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠ·Π»ΠΎΠ² Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ Π² Π²ΠΈΠ΄Π΅ массива. ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… 10-5 ΠΎΡ‚ фактичСского ΠΎΡ‚Π²Π΅Ρ‚Π°. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: root = [3,9,20,null,null,15,7]
Output: [3.00000,14.50000,11.00000]
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£ΠžΠ±Ρ…ΠΎΠ΄ Π΄Π΅Ρ€Π΅Π²Π° Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΎΠ±Ρ…ΠΎΠ΄ Π² ΡˆΠΈΡ€ΠΈΠ½Ρƒ (BFS) для ΠΎΠ±Ρ…ΠΎΠ΄Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ уровня Π΄Π΅Ρ€Π΅Π²Π°. 2βƒ£ΠŸΠΎΠ΄ΡΡ‡Π΅Ρ‚ срСднСго значСния Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ уровня Π΄Π΅Ρ€Π΅Π²Π° подсчитайтС сумму Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΡƒΠ·Π»ΠΎΠ² ΠΈ количСство ΡƒΠ·Π»ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ срСднСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. 3⃣БохранСниС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚Π΅ срСднСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ уровня Π² массив ΠΈ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ Π΅Π³ΠΎ. 😎 РСшСниС:
using System;
using System.Collections.Generic;

public class Solution {
    public IList<double> AverageOfLevels(TreeNode root) {
        var result = new List<double>();
        var queue = new Queue<TreeNode>();
        queue.Enqueue(root);

        while (queue.Count > 0) {
            long sum = 0;
            int count = queue.Count;
            for (int i = 0; i < count; i++) {
                var node = queue.Dequeue();
                sum += node.val;
                if (node.left != null) queue.Enqueue(node.left);
                if (node.right != null) queue.Enqueue(node.right);
            }
            result.Add((double)sum / count);
        }

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

#medium Π—Π°Π΄Π°Ρ‡Π°: 636. Exclusive Time of Functions На ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΌ процСссорС выполняСтся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, содСрТащая n Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. КаТдая функция ΠΈΠΌΠ΅Π΅Ρ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ID ΠΎΡ‚ 0 Π΄ΠΎ n-1. Π’Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ хранятся Π² стСкС Π²Ρ‹Π·ΠΎΠ²ΠΎΠ²: ΠΊΠΎΠ³Π΄Π° начинаСтся Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π΅Π΅ ID заталкиваСтся Π² стСк, Π° ΠΊΠΎΠ³Π΄Π° Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ заканчиваСтся, Π΅Π΅ ID выгруТаСтся ΠΈΠ· стСка. Ѐункция, Ρ‡Π΅ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ находится Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΉ части стСка, являСтся Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ выполняСмой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° функция запускаСтся ΠΈΠ»ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, ΠΌΡ‹ пишСм Π»ΠΎΠ³ с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ, Π½Π°Ρ‡Π°Π»ΠΎΠΌ ΠΈΠ»ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ ΠΌΠ΅Ρ‚ΠΊΠΎΠΉ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π’Π°ΠΌ прСдоставляСтся список logs, Π³Π΄Π΅ logs[i] прСдставляСт собой i-Π΅ сообщСниС Π»ΠΎΠ³Π°, ΠΎΡ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΊΠ°ΠΊ строка "{function_id}:{"start" | "end"}:{timestamp}". НапримСр, "0:start:3" ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ 0 начался Π² Π½Π°Ρ‡Π°Π»Π΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΊΠΈ 3, Π° "1:end:2" ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ 1 Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΡΡ Π² ΠΊΠΎΠ½Ρ†Π΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΊΠΈ 2. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ функция ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Π° нСсколько Ρ€Π°Π·, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, рСкурсивно. Π˜ΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ врСмя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ - это сумма Π²Ρ€Π΅ΠΌΠ΅Π½ выполнСния всСх Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. НапримСр, Ссли функция вызываСтся Π΄Π²Π°ΠΆΠ΄Ρ‹, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ Π²Ρ‹Π·ΠΎΠ² выполняСтся Π·Π° 2 Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ - Π·Π° 1 Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ, Ρ‚ΠΎ эксклюзивноС врСмя Ρ€Π°Π²Π½ΠΎ 2 + 1 = 3. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ эксклюзивноС врСмя ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² массив, Π³Π΄Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ i-ΠΌΡƒ индСксу прСдставляСт собой эксклюзивноС врСмя для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ i. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: n = 2, logs = ["0:start:0","1:start:2","1:end:5","0:end:6"]
Output: [3,4]
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£ΠŸΠ°Ρ€ΡΠΈΠ½Π³ Π»ΠΎΠ³ΠΎΠ² ΠŸΡ€ΠΎΠΉΠ΄ΠΈΡ‚Π΅ΡΡŒ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ Π»ΠΎΠ³Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Ρ‚ΡŒ дСйствиС (start ΠΈΠ»ΠΈ end) ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ вмСстС с Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΊΠΎΠΉ. 2βƒ£Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ стСка Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ стСк для отслСТивания Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Если Π»ΠΎΠ³ содСрТит start, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π² стСк ΠΈ Π½Π°Ρ‡Π½ΠΈΡ‚Π΅ отсчСт Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Если Π»ΠΎΠ³ содСрТит end, снимитС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ со стСка ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ эксклюзивноС врСмя. 3βƒ£ΠžΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния Когда функция Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ Π΅Π΅ эксклюзивноС врСмя ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΠΉΡ‚Π΅ врСмя выполнСния Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. 😎 РСшСниС:
using System;
using System.Collections.Generic;

public class Solution {
    public int[] ExclusiveTime(int n, IList<string> logs) {
        Stack<int> stack = new Stack<int>();
        int[] times = new int[n];
        int prevTime = 0;
        
        foreach (string log in logs) {
            string[] parts = log.Split(':');
            int fid = int.Parse(parts[0]);
            string type = parts[1];
            int time = int.Parse(parts[2]);
            
            if (type == "start") {
                if (stack.Count > 0) {
                    times[stack.Peek()] += time - prevTime;
                }
                stack.Push(fid);
                prevTime = time;
            } else {
                times[stack.Pop()] += time - prevTime + 1;
                prevTime = time + 1;
            }
        }
        
        return times;
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

#medium Π—Π°Π΄Π°Ρ‡Π°: 635. Design Log Storage System Π’Π°ΠΌ даСтся нСсколько ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ², Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΆΡƒΡ€Π½Π°Π» содСрТит ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΌΠ΅Ρ‚ΠΊΡƒ. ВрСмСнная ΠΌΠ΅Ρ‚ΠΊΠ° - это строка, ΠΈΠΌΠ΅ΡŽΡ‰Π°Ρ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚: Π“ΠΎΠ΄:ΠœΠ΅ΡΡΡ†:Π”Π΅Π½ΡŒ:Час:ΠœΠΈΠ½ΡƒΡ‚Π°:Π‘Π΅ΠΊΡƒΠ½Π΄Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 2017:01:01:23:59:59. ВсС Π΄ΠΎΠΌΠ΅Π½Ρ‹ - дСсятичныС числа с Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ. РСализация класса LogSystem: LogSystem() Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ LogSystem. void put(int id, string timestamp) БохраняСт Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ ΠΆΡƒΡ€Π½Π°Π» (id, timestamp) Π² вашСй систСмС хранСния. int[] retrieve(string start, string end, string granularity) Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ², Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΊΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… находятся Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ‚ start Π΄ΠΎ end Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ. start ΠΈ end ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, Ρ‡Ρ‚ΠΎ ΠΈ timestamp, Π° granularity ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, насколько Ρ‚ΠΎΡ‡Π½Ρ‹ΠΌ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ (Ρ‚. Π΅. с Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ Π΄ΠΎ дня, ΠΌΠΈΠ½ΡƒΡ‚Ρ‹ ΠΈ Ρ‚. Π΄.). НапримСр, start = "2017:01:01:23:59:59", end = "2017:01:02:23:59:59", Π° granularity = "Day" ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΆΡƒΡ€Π½Π°Π»Ρ‹ Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ‚ 1 января 2017 Π³ΠΎΠ΄Π° Π΄ΠΎ 2 января 2017 Π³ΠΎΠ΄Π° Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π° час, ΠΌΠΈΠ½ΡƒΡ‚Ρƒ ΠΈ сСкунду для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ записи ΠΆΡƒΡ€Π½Π°Π»Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input
["LogSystem", "put", "put", "put", "retrieve", "retrieve"]
[[], [1, "2017:01:01:23:59:59"], [2, "2017:01:01:22:59:59"], [3, "2016:01:01:00:00:00"], ["2016:01:01:01:01:01", "2017:01:01:23:00:00", "Year"], ["2016:01:01:01:01:01", "2017:01:01:23:00:00", "Hour"]]
Output
[null, null, null, null, [3, 2, 1], [2, 1]]
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΈ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ put, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΆΡƒΡ€Π½Π°Π» с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ id ΠΈ timestamp Π² систСмС хранСния. 2⃣ЀормированиС Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ retrieve, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠΊ Π½Π° основС Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ start, end ΠΈ granularity. 3βƒ£Π€ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ сформированный Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ для Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² Ρ‚Π΅Ρ… ΠΆΡƒΡ€Π½Π°Π»ΠΎΠ², Ρ‡ΡŒΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΊΠΈ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² этот Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½. 😎 РСшСниС:
using System;
using System.Collections.Generic;

public class LogSystem {
    private List<LogEntry> logs;

    public LogSystem() {
        logs = new List<LogEntry>();
    }

    public void Put(int id, string timestamp) {
        logs.Add(new LogEntry(id, timestamp));
    }

    public IList<int> Retrieve(string start, string end, string granularity) {
        int index = GetGranularityIndex(granularity);
        string startPrefix = start.Substring(0, index);
        string endPrefix = end.Substring(0, index);

        List<int> result = new List<int>();
        foreach (var log in logs) {
            string timestampPrefix = log.Timestamp.Substring(0, index);
            if (startPrefix.CompareTo(timestampPrefix) <= 0 && timestampPrefix.CompareTo(endPrefix) <= 0) {
                result.Add(log.Id);
            }
        }
        return result;
    }

    private int GetGranularityIndex(string granularity) {
        switch (granularity) {
            case "Year": return 4;
            case "Month": return 7;
            case "Day": return 10;
            case "Hour": return 13;
            case "Minute": return 16;
            case "Second": return 19;
            default: return 19;
        }
    }

    private class LogEntry {
        public int Id { get; }
        public string Timestamp { get; }

        public LogEntry(int id, string timestamp) {
            Id = id;
            Timestamp = timestamp;
        }
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ