en
Feedback
C# | LeetCode

C# | LeetCode

Open in Telegram

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

Show more
3 204
Subscribers
-224 hours
-47 days
-3430 days
Posts Archive
Π—Π°Π΄Π°Ρ‡Π°: 323. Number of Connected Components in an Undirected Graph Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π£ вас Π΅ΡΡ‚ΡŒ Π³Ρ€Π°Ρ„ ΠΈΠ· n ΡƒΠ·Π»ΠΎΠ². Π’Π°ΠΌ Π΄Π°Π½ΠΎ Ρ†Π΅Π»
Π—Π°Π΄Π°Ρ‡Π°: 323. Number of Connected Components in an Undirected Graph Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π£ вас Π΅ΡΡ‚ΡŒ Π³Ρ€Π°Ρ„ ΠΈΠ· n ΡƒΠ·Π»ΠΎΠ². Π’Π°ΠΌ Π΄Π°Π½ΠΎ Ρ†Π΅Π»ΠΎΠ΅ число n ΠΈ массив edges, Π³Π΄Π΅ edges[i] = [ai, bi] ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Ρ€Π΅Π±Ρ€Π° ΠΌΠ΅ΠΆΠ΄Ρƒ ai ΠΈ bi Π² Π³Ρ€Π°Ρ„Π΅. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ количСство связных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π² Π³Ρ€Π°Ρ„Π΅. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: n = 5, edges = [[0,1],[1,2],[3,4]]
Output: 2
πŸ‘¨β€πŸ’» Алгоритм: 1⃣БозданиС списка смСТности Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ список смСТности, Ρ‚Π°ΠΊΠΎΠΉ Ρ‡Ρ‚ΠΎ adj[v] содСрТит всС смСТныС Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ v. 2βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ посСщСнных ΡƒΠ·Π»ΠΎΠ² Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ Ρ…ΡΡˆ-ΠΊΠ°Ρ€Ρ‚Ρƒ ΠΈΠ»ΠΈ массив visited для отслСТивания посСщСнных Π²Π΅Ρ€ΡˆΠΈΠ½. 3βƒ£ΠŸΠΎΠ΄ΡΡ‡Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ счСтчик ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π΅Π³ΠΎ Π½ΡƒΠ»Π΅ΠΌ. Π˜Ρ‚Π΅Ρ€ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ Π² edges, ΠΈ Ссли Π²Π΅Ρ€ΡˆΠΈΠ½Π° Π΅Ρ‰Π΅ Π½Π΅ Π±Ρ‹Π»Π° посСщСна, Π½Π°Ρ‡Π½ΠΈΡ‚Π΅ DFS с этой Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹. ДобавляйтС ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ, ΠΏΠΎΡΠ΅Ρ‰Π΅Π½Π½ΡƒΡŽ Π²ΠΎ врСмя DFS, Π² visited. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° начинаСтся Π½ΠΎΠ²Ρ‹ΠΉ DFS, ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΠΉΡ‚Π΅ счСтчик Π½Π° ΠΎΠ΄ΠΈΠ½. Π’ ΠΊΠΎΠ½Ρ†Π΅, счСтчик Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ количСство связных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π² Π½Π΅ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ Π³Ρ€Π°Ρ„Π΅. 😎 РСшСниС:
public class Solution {
    public int CountComponents(int n, int[][] edges) {
        var adj = new Dictionary<int, List<int>>();
        for (int i = 0; i < n; i++) adj[i] = new List<int>();
        foreach (var edge in edges) {
            adj[edge[0]].Add(edge[1]);
            adj[edge[1]].Add(edge[0]);
        }

        var visited = new HashSet<int>();
        int count = 0;

        void Dfs(int node) {
            var stack = new Stack<int>();
            stack.Push(node);
            while (stack.Count > 0) {
                var current = stack.Pop();
                if (visited.Add(current)) {
                    foreach (var neighbor in adj[current]) {
                        if (!visited.Contains(neighbor)) stack.Push(neighbor);
                    }
                }
            }
        }

        for (int i = 0; i < n; i++) {
            if (visited.Add(i)) {
                Dfs(i);
                count++;
            }
        }

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

Π—Π°Π΄Π°Ρ‡Π°: 1100. Find K-Length Substrings With No Repeated Characters Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½Π° строка s ΠΈ Ρ†Π΅Π»ΠΎΠ΅ число k. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ количСство подстрок Π² s Π΄Π»ΠΈΠ½ΠΎΠΉ k, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ содСрТат ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΡ…ΡΡ символов. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: s = "havefunonleetcode", k = 5
Output: 6
Explanation: There are 6 substrings they are: 'havef','avefu','vefun','efuno','etcod','tcode'.
πŸ‘¨β€πŸ’» Алгоритм: 1⃣Если k > 26, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ 0, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ строки Π΄Π»ΠΈΠ½ΠΎΠΉ Π±ΠΎΠ»Π΅Π΅ 26 символов с ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ символами. Для ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… случаСв, Π³Π΄Π΅ k <= 26, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ подстроку Π΄Π»ΠΈΠ½ΠΎΠΉ k Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΡ…ΡΡ символов. 2βƒ£Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΡ ΠΏΠΎ строкС s ΠΎΡ‚ индСкса 0 Π΄ΠΎ n - k (Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ), Π³Π΄Π΅ n - Π΄Π»ΠΈΠ½Π° строки s: Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ индСкса i: Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ Ρ„Π»Π°Π³ isUnique ΠΊΠ°ΠΊ true ΠΈ массив частот Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 26 для подсчСта частот ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ символа. Π˜Ρ‚Π΅Ρ€ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ k символов ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΠΉΡ‚Π΅ частоту ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ встрСчСнного символа Π² массивС частот. Если частота любого символа становится большС 1, установитС isUnique Π² false ΠΈ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚Π΅ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ. Если послС ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ k символам Ρ„Π»Π°Π³ isUnique всС Π΅Ρ‰Π΅ Ρ€Π°Π²Π΅Π½ true, ΡƒΠ²Π΅Π»ΠΈΡ‡ΡŒΡ‚Π΅ счСтчик ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² Π½Π° 1. 3⃣ВСрнитС количСство подстрок Π±Π΅Π· ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΡ…ΡΡ символов послС ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ всСм индСксам ΠΎΡ‚ 0 Π΄ΠΎ n - k. 😎 РСшСниС:
public class Solution {
    public int NumKLenSubstrNoRepeats(string s, int k) {
        if (k > 26) return 0;
        
        int answer = 0;
        int n = s.Length;
        
        for (int i = 0; i <= n - k; i++) {
            int[] freq = new int[26];
            bool isUnique = true;
            
            for (int j = i; j < i + k; j++) {
                freq[s[j] - 'a']++;
                
                if (freq[s[j] - 'a'] > 1) {
                    isUnique = false;
                    break;
                }
            }
            
            if (isUnique) answer++;
        }
        
        return answer;
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 216. Combination Sum III Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium НайдитС всС допустимыС ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ k чисСл, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² суммС Π΄Π°ΡŽΡ‚ n, ΠΏΡ€ΠΈ условии, Ρ‡Ρ‚ΠΎ: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ числа ΠΎΡ‚ 1 Π΄ΠΎ 9. КаТдоС число ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π°. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ список всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… допустимых ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ. Бписок Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ, ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ Π² любом порядкС. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: k = 3, n = 9
Output: [[1,2,6],[1,3,5],[2,3,4]]
Explanation:
1 + 2 + 6 = 9
1 + 3 + 5 = 9
2 + 3 + 4 = 9
There are no other valid combinations.
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΈ запуск рСкурсивной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ backtrack, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΎΡΡ‚Π°Π²ΡˆΡƒΡŽΡΡ сумму, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ k, Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ, индСкс ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ элСмСнта для добавлСния ΠΈ список Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ пустыС Π²Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ для хранСния Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ ΠΈ всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². ЗапуститС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ backtrack с Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ значСниями: ΠΏΠΎΠ»Π½ΠΎΠΉ суммой n, Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ k, пустой ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠ΅ΠΉ, Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌ индСксом 0 ΠΈ пустым списком Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². 2⃣РСкурсивная ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°: Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ backtrack ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ссли тСкущая сумма Ρ€Π°Π²Π½Π° Π½ΡƒΠ»ΡŽ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ Ρ€Π°Π²Π΅Π½ k, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ копию Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ Π² список Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². Если тСкущая сумма мСньшС нуля ΠΈΠ»ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ Ρ€Π°Π²Π΅Π½ k, ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚Π΅ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π²Π΅Ρ‚Π²ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Π˜Π½Π°Ρ‡Π΅, ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΡƒΠΉΡ‚Π΅ΡΡŒ ΠΏΠΎ ΠΎΡΡ‚Π°Π²ΡˆΠΈΠΌΡΡ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚Π°ΠΌ, начиная с Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ индСкса. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚Π° Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π΅Π³ΠΎ Π² Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ, ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ ΠΎΡΡ‚Π°Π²ΡˆΡƒΡŽΡΡ сумму ΠΈ Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ backtrack с ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ. ПослС возвращСния ΠΈΠ· рСкурсивного Π²Ρ‹Π·ΠΎΠ²Π° ΡƒΠ΄Π°Π»ΠΈΡ‚Π΅ послСдний элСмСнт ΠΈΠ· ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ для рассмотрСния ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚Π°. 3⃣ВозвращСниС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ²: По Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ всСх рСкурсивных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² функция combinationSum3 Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список всСх Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ. 😎 РСшСниС:
public class Solution {
    private void Backtrack(int remain, int k, List<int> comb, int nextStart, List<IList<int>> results) {
        if (remain == 0 && comb.Count == k) {
            results.Add(new List<int>(comb));
            return;
        } else if (remain < 0 || comb.Count == k) {
            return;
        }

        for (int i = nextStart; i < 9; i++) {
            comb.Add(i + 1);
            Backtrack(remain - i - 1, k, comb, i + 1, results);
            comb.RemoveAt(comb.Count - 1);
        }
    }

    public IList<IList<int>> CombinationSum3(int k, int n) {
        var results = new List<IList<int>>();
        var comb = new List<int>();
        Backtrack(n, k, comb, 0, results);
        return results;
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 643. Maximum Average Subarray I Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: easy Π’Π°ΠΌ Π΄Π°Π½ цСлочислСнный массив 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;
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 173. Binary Search Tree Iterator Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ класс BSTIterator, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΏΠΎ ΠΎΠ±Ρ…
Π—Π°Π΄Π°Ρ‡Π°: 173. Binary Search Tree Iterator Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ класс BSTIterator, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΏΠΎ ΠΎΠ±Ρ…ΠΎΠ΄Ρƒ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π° поиска (BST) Π² порядкС in-order: BSTIterator(TreeNode root): Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса BSTIterator. ΠšΠΎΡ€Π΅Π½ΡŒ BST пСрСдаСтся Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° конструктора. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ Π½Π° Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ число, мСньшСС любого элСмСнта Π² BST. boolean hasNext(): Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, Ссли Π² ΠΎΠ±Ρ…ΠΎΠ΄Π΅ справа ΠΎΡ‚ указатСля сущСствуСт число, ΠΈΠ½Π°Ρ‡Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ false. int next(): ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π²ΠΏΡ€Π°Π²ΠΎ, Π·Π°Ρ‚Π΅ΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ число Π½Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ указатСля Π½Π° Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ наимСньшСС число, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² next() Π²Π΅Ρ€Π½Π΅Ρ‚ наимСньший элСмСнт Π² BST. МоТно ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ²Ρ‹ next() всСгда Π±ΡƒΠ΄ΡƒΡ‚ допустимы. Π’ΠΎ Π΅ΡΡ‚ΡŒ, ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ next() Π² ΠΎΠ±Ρ…ΠΎΠ΄Π΅ всСгда Π±ΡƒΠ΄Π΅Ρ‚ хотя Π±Ρ‹ ΠΎΠ΄Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ число. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input
["BSTIterator", "next", "next", "hasNext", "next", "hasNext", "next", "hasNext", "next", "hasNext"]
[[[7, 3, 15, null, null, 9, 20]], [], [], [], [], [], [], [], [], []]
Output
[null, 3, 7, true, 9, true, 15, true, 20, false]

Explanation
BSTIterator bSTIterator = new BSTIterator([7, 3, 15, null, null, 9, 20]);
bSTIterator.next();    // return 3
bSTIterator.next();    // return 7
bSTIterator.hasNext(); // return True
bSTIterator.next();    // return 9
bSTIterator.hasNext(); // return True
bSTIterator.next();    // return 15
bSTIterator.hasNext(); // return True
bSTIterator.next();    // return 20
bSTIterator.hasNext(); // return False
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ пустой массив, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΡƒΠ·Π»Ρ‹ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π° поиска Π² отсортированном порядкС. 2βƒ£ΠœΡ‹ ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ поиска Π² порядкС in-order ΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡƒΠ·Π»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ, добавляСм Π΅Π³ΠΎ Π² наш массив ΡƒΠ·Π»ΠΎΠ². ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ ΡƒΠ·Π»Π° сначала Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ (ΠΈΠ»ΠΈ рСкурсивно Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ) Π΅Π³ΠΎ Π»Π΅Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ, Π° послС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΡƒΠ·Π»Π° β€” Π΅Π³ΠΎ ΠΏΡ€Π°Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ. 3βƒ£ΠšΠΎΠ³Π΄Π° Ρƒ нас Π±ΡƒΠ΄ΡƒΡ‚ всС ΡƒΠ·Π»Ρ‹ Π² массивС, Π½Π°ΠΌ просто Π½ΡƒΠΆΠ΅Π½ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΈΠ»ΠΈ индСкс Π² этом массивС для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄Π²ΡƒΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ next ΠΈ hasNext. Всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° вызываСтся hasNext, ΠΌΡ‹ просто провСряСм, достиг Π»ΠΈ индСкс ΠΊΠΎΠ½Ρ†Π° массива ΠΈΠ»ΠΈ Π½Π΅Ρ‚. ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ next ΠΌΡ‹ просто Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ элСмСнт, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ индСкс. Π’Π°ΠΊΠΆΠ΅, послС Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ next, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ индСкс Π½Π° ΠΎΠ΄ΠΈΠ½ шаг Π²ΠΏΠ΅Ρ€Π΅Π΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ прогрСсс нашСго ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°. 😎 РСшСниС:
public class TreeNode {
    public int val;
    public TreeNode left;
    public TreeNode right;
    public TreeNode(int x) { val = x; left = null; right = null; }
}

public class BSTIterator {
    private List<int> nodesSorted;
    private int index;

    private void Inorder(TreeNode root) {
        if (root == null) return;
        Inorder(root.left);
        nodesSorted.Add(root.val);
        Inorder(root.right);
    }

    public BSTIterator(TreeNode root) {
        nodesSorted = new List<int>();
        index = -1;
        Inorder(root);
    }

    public int Next() {
        return nodesSorted[++index];
    }

    public bool HasNext() {
        return index + 1 < nodesSorted.Count;
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 624. Maximum Distance in Arrays Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π’Π°ΠΌ Π΄Π°Π½ΠΎ m массивов, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ массив отсортирован ΠΏΠΎ Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°Π½ΠΈΡŽ.
Π—Π°Π΄Π°Ρ‡Π°: 624. Maximum Distance in Arrays Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π’Π°ΠΌ Π΄Π°Π½ΠΎ m массивов, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ массив отсортирован ΠΏΠΎ Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°Π½ΠΈΡŽ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Π·ΡΡ‚ΡŒ Π΄Π²Π° Ρ†Π΅Π»Ρ‹Ρ… числа ΠΈΠ· Π΄Π²ΡƒΡ… Ρ€Π°Π·Π½Ρ‹Ρ… массивов (ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ массив Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎ) ΠΈ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ расстояниС. ΠœΡ‹ опрСдСляСм расстояниС ΠΌΠ΅ΠΆΠ΄Ρƒ двумя Ρ†Π΅Π»Ρ‹ΠΌΠΈ числами a ΠΈ b ΠΊΠ°ΠΊ ΠΈΡ… Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΡƒΡŽ Ρ€Π°Π·Π½ΠΎΡΡ‚ΡŒ |a - b|. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ максимальноС расстояниС. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: arrays = [[1,2,3],[4,5],[1,2,3]]
Output: 4
πŸ‘¨β€πŸ’» Алгоритм: 1⃣НайдитС ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт ΠΈΠ· всСх ΠΏΠ΅Ρ€Π²Ρ‹Ρ… элСмСнтов массивов ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт ΠΈΠ· всСх послСдних элСмСнтов массивов. 2⃣РассчитайтС максимальноС расстояниС ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ элСмСнтами. 3⃣ВСрнитС это максимальноС расстояниС. 😎 РСшСниС:
public class Solution {
    public int MaxDistance(IList<IList<int>> arrays) {
        int minVal = arrays[0][0];
        int maxVal = arrays[0][arrays[0].Count - 1];
        int maxDistance = 0;
        
        for (int i = 1; i < arrays.Count; i++) {
            maxDistance = Math.Max(maxDistance, Math.Abs(arrays[i][arrays[i].Count - 1] - minVal), Math.Abs(arrays[i][0] - maxVal));
            minVal = Math.Min(minVal, arrays[i][0]);
            maxVal = Math.Max(maxVal, arrays[i][arrays[i].Count - 1]);
        }
        
        return maxDistance;
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 598. Range Addition II Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: Easy Π’Π°ΠΌ Π΄Π°Π½Π° ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° M Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ m x n, инициализированная нулями, ΠΈ массив ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈ
Π—Π°Π΄Π°Ρ‡Π°: 598. Range Addition II Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: Easy Π’Π°ΠΌ Π΄Π°Π½Π° ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° M Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ m x n, инициализированная нулями, ΠΈ массив ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ops, Π³Π΄Π΅ ops[i] = [ai, bi] ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ M[x][y] Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΎ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ для всСх 0 <= x < ai ΠΈ 0 <= y < bi. ΠŸΠΎΠ΄ΡΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΈ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ количСство ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… чисСл Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ послС выполнСния всСх ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: m = 3, n = 3, ops = [[2,2],[3,3]]
Output: 4
Explanation: The maximum integer in M is 2, and there are four of it in M. So return 4.
πŸ‘¨β€πŸ’» Алгоритм: 1⃣ВсС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π½Π° ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΎΠΉ ΠΏΠΎΠ΄ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ M, Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠΉ нулями, с Π²Π΅Ρ€Ρ…Π½ΠΈΠΌ Π»Π΅Π²Ρ‹ΠΌ ΡƒΠ³Π»ΠΎΠΌ Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ (0,0) ΠΈ Π½ΠΈΠΆΠ½ΠΈΠΌ ΠΏΡ€Π°Π²Ρ‹ΠΌ ΡƒΠ³Π»ΠΎΠΌ для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ [i,j] Π² Ρ‚ΠΎΡ‡ΠΊΠ΅ (i,j). 2βƒ£ΠœΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π΅ΠΌ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ всС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. ΠœΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ элСмСнты Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² области пСрСсСчСния ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΎΠ², ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Для опрСдСлСния этой области Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½ΠΈΠΆΠ½ΠΈΠΉ ΠΏΡ€Π°Π²Ρ‹ΠΉ ΡƒΠ³ΠΎΠ» ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‰Π΅ΠΉΡΡ области (x,y), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π²Π΅Π½ (min(op[0]), min(op[1])). 3βƒ£ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ элСмСнтов, находящихся Π² области пСрСсСчСния, опрСдСляСтся ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ x ΠΈ y. 😎 РСшСниС:
public class Solution {
    public int MaxCount(int m, int n, int[][] ops) {
        int minA = m;
        int minB = n;
        foreach (var op in ops) {
            minA = Math.Min(minA, op[0]);
            minB = Math.Min(minB, op[1]);
        }
        return minA * minB;
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 71. Simplify Path Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ Π² стилС Unix. НСобходимо ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² каноничСский, ΠΏΡ€
Π—Π°Π΄Π°Ρ‡Π°: 71. Simplify Path Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ Π² стилС Unix. НСобходимо ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² каноничСский, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ лишниС слэши, .(Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ) ΠΈ ..(Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ Π½Π° ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π²Ρ‹ΡˆΠ΅). ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: path = "/home/"

Output: "/home"

Explanation:

The trailing slash should be removed.
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π Π°Π·Π±ΠΈΡ‚ΡŒ ΠΏΡƒΡ‚ΡŒ /ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π΄Π΅Ρ‚Π°Π»ΡŒ: ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ .ΠΈ пустыС строки . 2βƒ£ΠŸΡ€ΠΈ ..ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ послСднСго элСмСнта ΠΈΠ· стСки, Ссли ΠΎΠ½ Π΅ΡΡ‚ΡŒ. 3⃣ВсС Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ сохранСния Π² стСкС, Π·Π°Ρ‚Π΅ΠΌ сбор Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². 😎 РСшСниС:
public class Solution {
    public string SimplifyPath(string path) {
        Stack<string> stack = new Stack<string>();
        string[] components = path.Split('/');
        foreach (string directory in components) {
            if (directory.Equals(".") || directory.Length == 0) {
                continue;
            } else if (directory.Equals("..")) {
                if (stack.Any()) {
                    stack.Pop();
                }
            } else {
                stack.Push(directory);
            }
        }

        StringBuilder result = new StringBuilder();
        foreach (string dir in stack.Reverse()) {
            result.Append("/");
            result.Append(dir);
        }

        return result.Length > 0 ? result.ToString() : "/";
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 1247. Minimum Swaps to Make Strings Equal Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: hard Π’Π°ΠΌ Π΄Π°Π½Ρ‹ Π΄Π²Π΅ строки s1 ΠΈ s2 ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹, состоящиС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· Π±ΡƒΠΊΠ² "x" ΠΈ "y". Π’Π°ΡˆΠ° Π·Π°Π΄Π°Ρ‡Π° - ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ эти Π΄Π²Π΅ строки Ρ€Π°Π²Π½Ρ‹ΠΌΠΈ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ мСстами Π»ΡŽΠ±Ρ‹Π΅ Π΄Π²Π° символа, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠ΅ Ρ€Π°Π·Π½Ρ‹ΠΌ строкам, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚: ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ мСстами s1[i] ΠΈ s2[j]. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ минимальноС количСство ΠΎΠ±ΠΌΠ΅Π½ΠΎΠ², Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ s1 ΠΈ s2 Ρ€Π°Π²Π½Ρ‹ΠΌΠΈ, ΠΈΠ»ΠΈ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ -1, Ссли это Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: arr = [1,2]
Output: 2
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£ΠŸΠΎΠ΄ΡΡ‡Π΅Ρ‚ Π½Π΅ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΏΠ°Ρ€: ΠŸΡ€ΠΎΠΉΠ΄ΠΈΡ‚Π΅ ΠΏΠΎ строкам s1 ΠΈ s2, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ количСство ΠΏΠ°Ρ€ xy ΠΈ yx. ΠŸΠ°Ρ€Π° xy Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° s1[i] Ρ€Π°Π²Π½ΠΎ 'x', Π° s2[i] Ρ€Π°Π²Π½ΠΎ 'y'. ΠŸΠ°Ρ€Π° yx Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, ΠΊΠΎΠ³Π΄Π° s1[i] Ρ€Π°Π²Π½ΠΎ 'y', Π° s2[i] Ρ€Π°Π²Π½ΠΎ 'x'. 2βƒ£ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° чСтности: Если сумма количСства ΠΏΠ°Ρ€ xy ΠΈ yx нСчСтная, Ρ‚ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ строки Ρ€Π°Π²Π½Ρ‹ΠΌΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ каТдая Π·Π°ΠΌΠ΅Π½Π° ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ сумму Π½Π΅ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΏΠ°Ρ€ Π½Π° 2. Π’ этом случаС Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ -1. 3⃣ВычислСниС минимального количСства Π·Π°ΠΌΠ΅Π½: Если количСство ΠΏΠ°Ρ€ xy Ρ‡Π΅Ρ‚Π½ΠΎΠ΅ ΠΈ количСство ΠΏΠ°Ρ€ yx Ρ‡Π΅Ρ‚Π½ΠΎΠ΅, Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ Π΄Π²Π΅ ΠΏΠ°Ρ€Ρ‹ xy ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ Π΄Π²Π΅ ΠΏΠ°Ρ€Ρ‹ yx ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΌΠ΅Π½ΡΡ‚ΡŒ Π·Π° ΠΎΠ΄ΠΈΠ½ Ρ…ΠΎΠ΄. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ минимальноС количСство Π·Π°ΠΌΠ΅Π½ Ρ€Π°Π²Π½ΠΎ xy // 2 + yx // 2. Если количСство ΠΏΠ°Ρ€ xy Π½Π΅Ρ‡Π΅Ρ‚Π½ΠΎΠ΅ ΠΈ количСство ΠΏΠ°Ρ€ yx Π½Π΅Ρ‡Π΅Ρ‚Π½ΠΎΠ΅, Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΏΠ°Ρ€Ρƒ xy ΠΈ ΠΎΠ΄Π½Ρƒ ΠΏΠ°Ρ€Ρƒ yx Π·Π° Π΄Π²Π° Ρ…ΠΎΠ΄Π°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ минимальноС количСство Π·Π°ΠΌΠ΅Π½ Ρ€Π°Π²Π½ΠΎ xy // 2 + yx // 2 + 2. 😎 РСшСниС:
public class Solution {
    public int MinimumSwap(string s1, string s2) {
        int xy = 0, yx = 0;
        for (int i = 0; i < s1.Length; i++) {
            if (s1[i] == 'x' && s2[i] == 'y') {
                xy++;
            } else if (s1[i] == 'y' && s2[i] == 'x') {
                yx++;
            }
        }
        if ((xy + yx) % 2 != 0) {
            return -1;
        }
        return xy / 2 + yx / 2 + (xy % 2) * 2;
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 1199. Minimum Time to Build Blocks Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: hard Π’Π°ΠΌ Π΄Π°Π½ список Π±Π»ΠΎΠΊΠΎΠ², Π³Π΄Π΅ blocks[i] = t ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π° ΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ i-Π³ΠΎ Π±Π»ΠΎΠΊΠ° трСбуСтся t Π΅Π΄ΠΈΠ½ΠΈΡ† Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π‘Π»ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ построСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΈΠΌ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΌ. Π Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈΠ±ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒΡΡ Π½Π° Π΄Π²ΡƒΡ… Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… (количСство Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… увСличиваСтся Π½Π° ΠΎΠ΄Π½ΠΎΠ³ΠΎ), Π»ΠΈΠ±ΠΎ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊ ΠΈ ΡƒΠΉΡ‚ΠΈ Π΄ΠΎΠΌΠΎΠΉ. Оба Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. ВрСмя, Π·Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ Π½Π° Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ Π½Π° Π΄Π²ΡƒΡ…, Π·Π°Π΄Π°Π½ΠΎ Ρ†Π΅Π»Ρ‹ΠΌ числом split. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ссли Π΄Π²Π° Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, ΠΎΠ½ΠΈ Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ, поэтому Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π²Π½Ρ‹ split. Π’Ρ‹Π²Π΅Π΄ΠΈΡ‚Π΅ минимальноС врСмя, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ для ΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΡΡ‚Π²Π° всСх Π±Π»ΠΎΠΊΠΎΠ². Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: blocks = [1,2,3], split = 1
Output: 4
Explanation: Split 1 worker into 2, then assign the first worker to the last block and split the second worker into 2.
Then, use the two unassigned workers to build the first two blocks.
The cost is 1 + max(3, 1 + max(1, 2)) = 4.
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΊΡƒΡ‡ΠΈ ΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ: Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΊΡƒΡ‡Ρƒ ΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ всС значСния Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈΠ· массива blocks. 2βƒ£ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΊΡƒΡ‡ΠΈ: Пока Π² ΠΊΡƒΡ‡Π΅ большС ΠΎΠ΄Π½ΠΎΠ³ΠΎ элСмСнта: - ΠΈΠ·Π²Π»Π΅ΠΊΠΈΡ‚Π΅ минимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· ΠΊΡƒΡ‡ΠΈ, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΠΌ Π΅Π³ΠΎ ΠΊΠ°ΠΊ x. - ΠΈΠ·Π²Π»Π΅ΠΊΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ минимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· ΠΊΡƒΡ‡ΠΈ, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΠΌ Π΅Π³ΠΎ ΠΊΠ°ΠΊ y. - создайтС Π½ΠΎΠ²ΠΎΠ΅ врСмя ΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΡΡ‚Π²Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Ρ€Π°Π²Π½ΠΎ split + y, ΠΈ Π²ΡΡ‚Π°Π²ΡŒΡ‚Π΅ Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² ΠΊΡƒΡ‡Ρƒ. 3⃣Возврат Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°: Когда Π² ΠΊΡƒΡ‡Π΅ останСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΎΠ½ΠΎ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌ для ΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΡΡ‚Π²Π° всСх Π±Π»ΠΎΠΊΠΎΠ². 😎 РСшСниС:
using System;
using System.Collections.Generic;

public class Solution {
    public int MinBuildTime(int[] blocks, int split) {
        PriorityQueue<int, int> pq = new PriorityQueue<int, int>();
        foreach (var block in blocks) {
            pq.Enqueue(block, block);
        }
        
        while (pq.Count > 1) {
            int x = pq.Dequeue();
            int y = pq.Dequeue();
            pq.Enqueue(split + y, split + y);
        }
        
        return pq.Dequeue();
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 629. K Inverse Pairs Array Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: hard Для цСлочислСнного массива nums инвСрсная ΠΏΠ°Ρ€Π° - это ΠΏΠ°Ρ€Π° Ρ†Π΅Π»Ρ‹Ρ… чисСл [i,
Π—Π°Π΄Π°Ρ‡Π°: 629. K Inverse Pairs Array Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: hard Для цСлочислСнного массива nums инвСрсная ΠΏΠ°Ρ€Π° - это ΠΏΠ°Ρ€Π° Ρ†Π΅Π»Ρ‹Ρ… чисСл [i, j], Π³Π΄Π΅ 0 <= i < j < nums.length ΠΈ nums[i] > nums[j]. Учитывая Π΄Π²Π° Ρ†Π΅Π»Ρ‹Ρ… числа n ΠΈ k, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ количСство Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… массивов, состоящих ΠΈΠ· чисСл ΠΎΡ‚ 1 Π΄ΠΎ n, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… сущСствуСт Ρ€ΠΎΠ²Π½ΠΎ k инвСрсных ΠΏΠ°Ρ€. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΡ‚Π²Π΅Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΌ, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ Π΅Π³ΠΎ ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ 109 + 7. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: n = 3, k = 0
Output: 1
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ массив dp Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ [n+1][k+1] ΠΈ установитС Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ dp[0][0] = 1. ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ значСния установитС Π² 0. 2⃣ЗаполнСниС DP-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π΄Π²Π° Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ†ΠΈΠΊΠ»Π° для заполнСния Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ DP. Π’Π½Π΅ΡˆΠ½ΠΈΠΉ Ρ†ΠΈΠΊΠ» ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅Ρ‚ Π΄Π»ΠΈΠ½Ρƒ массива i ΠΎΡ‚ 1 Π΄ΠΎ n, Π° Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ Ρ†ΠΈΠΊΠ» ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅Ρ‚ количСство инвСрсий j ΠΎΡ‚ 0 Π΄ΠΎ k. Если j == 0, Ρ‚ΠΎ dp[i][j] = 1. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС обновляйтС dp[i][j] с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ вставки Π½ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта Π² массив Π΄Π»ΠΈΠ½Ρ‹ i-1. 3⃣ВозвращСниС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ dp[n][k]. 😎 РСшСниС:
public class Solution {
    public int KInversePairs(int n, int k) {
        int MOD = 1000000007;
        int[,] dp = new int[n + 1, k + 1];
        dp[0, 0] = 1;

        for (int i = 1; i <= n; i++) {
            dp[i, 0] = 1;
            for (int j = 1; j <= k; j++) {
                dp[i, j] = (dp[i, j - 1] + dp[i - 1, j]) % MOD;
                if (j >= i) {
                    dp[i, j] = (dp[i, j] - dp[i - 1, j - i] + MOD) % MOD;
                }
            }
        }

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

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

public class Solution {
    public int DepthSumInverse(IList<NestedInteger> nestedList) {
        var queue = new Queue<NestedInteger>(nestedList);
        int depth = 1, maxDepth = 0, sumOfElements = 0, sumOfProducts = 0;

        while (queue.Count > 0) {
            int size = queue.Count;
            maxDepth = Math.Max(maxDepth, depth);

            for (int i = 0; i < size; i++) {
                var nested = queue.Dequeue();

                if (nested.IsInteger()) {
                    int value = nested.GetInteger();
                    sumOfElements += value;
                    sumOfProducts += value * depth;
                } else {
                    foreach (var ni in nested.GetList()) queue.Enqueue(ni);
                }
            }
            depth++;
        }
        return (maxDepth + 1) * sumOfElements - sumOfProducts;
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 1055. Shortest Way to Form String Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium ΠŸΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ строки - это новая строка, которая образуСтся ΠΈΠ· исходной строки ΠΏΡƒΡ‚Π΅ΠΌ удалСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… (ΠΌΠΎΠΆΠ½ΠΎ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ) символов Π±Π΅Π· Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ располоТСния ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ символов. (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, "ace" являСтся ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ "abcde", Π° "aec" - Π½Π΅Ρ‚). Если Π΄Π°Π½Ρ‹ Π΄Π²Π΅ строки source ΠΈ target, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ минимальноС количСство ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ source, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡ… объСдинСниС Ρ€Π°Π²Π½ΡΠ»ΠΎΡΡŒ target. Если Π·Π°Π΄Π°Ρ‡Π° Π½Π΅Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌΠ°, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ -1. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: source = "abc", target = "abcbc"
Output: 2
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉ Π΄Π²Π° указатСля для отслСТивания Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ Π² строках source ΠΈ target. 2βƒ£ΠŸΠ΅Ρ€Π΅Π±ΠΈΡ€Π°ΠΉ символы строки source, ΠΏΠΎΠΊΠ° Π½Π΅ найдСшь ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠΉ символ Π² target. Если Ρ‚Ρ‹ ΠΏΡ€ΠΎΡˆΠ΅Π» всю строку source ΠΈ Π½Π΅ нашСл всС символы target, ΡƒΠ²Π΅Π»ΠΈΡ‡ΡŒ счСтчик количСства ΠΏΠΎΠ΄ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ ΠΈ Π½Π°Ρ‡Π½ΠΈ снова с Π½Π°Ρ‡Π°Π»Π° source. 3βƒ£ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈ шаги 2 ΠΈ 3 Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΡ€ΠΎΠΉΠ΄Π΅ΡˆΡŒ всю строку target. 😎 РСшСниС:
public class Solution {
    public int MinSubsequences(string source, string target) {
        int subsequencesCount = 0;
        int targetIndex = 0;

        while (targetIndex < target.Length) {
            int sourceIndex = 0;
            subsequencesCount++;
            int startIndex = targetIndex;

            while (sourceIndex < source.Length && targetIndex < target.Length) {
                if (source[sourceIndex] == target[targetIndex]) {
                    targetIndex++;
                }
                sourceIndex++;
            }

            if (targetIndex == startIndex) {
                return -1;
            }
        }

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

Π—Π°Π΄Π°Ρ‡Π°: 31. Next Permutation Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium ΠŸΠ΅Ρ€Π΅ΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° массива Ρ†Π΅Π»Ρ‹Ρ… чисСл β€” это упорядочиваниС Π΅Π³ΠΎ элСмСнтов Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ пСрСстановка β€” это лСксикографичСски большая пСрСстановка. Если Ρ‚Π°ΠΊΠΎΠΉ порядок Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½, массив Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ отсортирован ΠΏΠΎ Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°Π½ΠΈΡŽ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: nums = [1,2,3]  
Output: [1,3,2]  
πŸ‘¨β€πŸ’» Алгоритм: 1⃣Найти ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт справа, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ мСньшС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ (nums[i] < nums[i+1]). 2⃣Найти наибольший элСмСнт справа, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ большС nums[i], ΠΈ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΡ… мСстами. 3βƒ£ΠŸΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΎΡΡ‚Π°Π²ΡˆΡƒΡŽΡΡ Ρ‡Π°ΡΡ‚ΡŒ массива послС i для минимальной лСксикографичСской пСрСстановки. 😎 РСшСниС:
public class Solution {
    public void NextPermutation(int[] nums) {
        int i = nums.Length - 2;
        while (i >= 0 && nums[i + 1] <= nums[i]) i--;

        if (i >= 0) {
            int j = nums.Length - 1;
            while (nums[j] <= nums[i]) j--;
            Swap(nums, i, j);
        }

        Reverse(nums, i + 1);
    }

    private void Reverse(int[] nums, int start) {
        int i = start, j = nums.Length - 1;
        while (i < j) Swap(nums, i++, j--);
    }

    private void Swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 27. Remove Element Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: easy Учитывая цСлочислСнный массив nums ΠΈ цСлочислСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ val, ΡƒΠ΄Π°Π»ΠΈΡ‚Π΅ всС вхоТдСния val Π² nums Π½Π° мСстС. ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ элСмСнтов ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½. Π—Π°Ρ‚Π΅ΠΌ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ количСство элСмСнтов Π² Π²ΠΈΠ΄Π΅ числа, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Ρ€Π°Π²Π½Ρ‹ val. Π£Ρ‡ΠΈΡ‚Ρ‹Π²Π°ΠΉΡ‚Π΅ количСство элСмСнтов Π² nums, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Ρ€Π°Π²Π½Ρ‹ val be k. Π§Ρ‚ΠΎΠ±Ρ‹ вас приняли, Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅: - Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚Π΅ массив nums Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ k элСмСнтов nums содСрТали элСмСнты, Π½Π΅ Ρ€Π°Π²Π½Ρ‹Π΅ val. ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ элСмСнты nums Π½Π΅ Π²Π°ΠΆΠ½Ρ‹, ΠΊΠ°ΠΊ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ nums. - Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒ k. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: nums = [3,2,2,3], val = 3  
Output: 2  
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ i для записи элСмСнтов, Π½Π΅ Ρ€Π°Π²Π½Ρ‹Ρ… val. 2βƒ£ΠŸΠ΅Ρ€Π΅Π±Ρ€Π°Ρ‚ΡŒ массив nums, копируя элСмСнты, ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΡ‚ val, Π½Π° мСсто i, с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ i. 3βƒ£Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒ i ΠΊΠ°ΠΊ количСство ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ элСмСнтов. 😎 РСшСниС:
public class Solution {
    public int RemoveElement(int[] nums, int val) {
        int i = 0;
        for (int j = 0; j < nums.Length; j++) {
            if (nums[j] != val) {
                nums[i++] = nums[j];
            }
        }
        return i;
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

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

Π—Π°Π΄Π°Ρ‡Π°: 322. Coin Change Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ цСлочислСнный массив coins, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ ΠΌΠΎΠ½Π΅Ρ‚Ρ‹ Ρ€Π°Π·Π½Ρ‹Ρ… Π½ΠΎΠΌΠΈΠ½Π°Π»ΠΎΠ², ΠΈ Ρ†Π΅Π»ΠΎΠ΅ число amount, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π΅ ΠΎΠ±Ρ‰ΡƒΡŽ сумму Π΄Π΅Π½Π΅Π³. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ минимальноС количСство ΠΌΠΎΠ½Π΅Ρ‚, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… для составлСния этой суммы. Если эту сумму Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ½Π΅Ρ‚, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ -1. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρƒ вас Π΅ΡΡ‚ΡŒ Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅ количСство ΠΌΠΎΠ½Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: coins = [1,2,5], amount = 11
Output: 3
Explanation: 11 = 5 + 5 + 1
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΈ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ backtracking Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ для хранСния минимального количСства ΠΌΠΎΠ½Π΅Ρ‚ ΠΈ Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ backtracking с Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ. 2⃣Ѐункция backtracking Π’Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ backtracking для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΌΠΎΠ½Π΅Ρ‚Ρ‹ ΠΈΠ· массива coins: ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ количСства ΠΌΠΎΠ½Π΅Ρ‚ Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π½ΠΎΠΌΠΈΠ½Π°Π»Π° (ΠΎΡ‚ 0 Π΄ΠΎ максимального количСства, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π΅Π· ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ΠΈΡ amount). Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ½Π΅Ρ‚ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ сумму ΠΈ Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ рСкурсивно для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΎΡΡ‚Π°Π²ΡˆΠ΅ΠΉΡΡ суммы. Если тСкущая комбинация Π΄Π°Π΅Ρ‚ ΠΌΠ΅Π½ΡŒΡˆΡƒΡŽ сумму ΠΌΠΎΠ½Π΅Ρ‚, ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ минимальноС количСство ΠΌΠΎΠ½Π΅Ρ‚. 3⃣Возврат Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Если комбинация, Π΄Π°ΡŽΡ‰Π°Ρ сумму amount, Π½Π°ΠΉΠ΄Π΅Π½Π°, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ минимальноС количСство ΠΌΠΎΠ½Π΅Ρ‚, ΠΈΠ½Π°Ρ‡Π΅ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ -1. 😎 РСшСниС:
public class Solution {
    public int CoinChange(int[] coins, int amount) {
        return CoinChange(0, coins, amount);
    }

    private int CoinChange(int idxCoin, int[] coins, int amount) {
        if (amount == 0) return 0;
        if (idxCoin < coins.Length && amount > 0) {
            int maxVal = amount / coins[idxCoin];
            int minCost = int.MaxValue;
            for (int x = 0; x <= maxVal; x++) {
                if (amount >= x * coins[idxCoin]) {
                    int res = CoinChange(idxCoin + 1, coins, amount - x * coins[idxCoin]);
                    if (res != -1)
                        minCost = Math.Min(minCost, res + x);
                }
            }
            return minCost == int.MaxValue ? -1 : minCost;
        }
        return -1;
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 328. Odd Even Linked List Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ односвязного списка. Π‘Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΡƒΠΉΡ‚Π΅ всС ΡƒΠ·Π»Ρ‹ с Π½Π΅Ρ‡Π΅Ρ‚Π½Ρ‹ΠΌΠΈ ΠΈΠ½Π΄Π΅
Π—Π°Π΄Π°Ρ‡Π°: 328. Odd Even Linked List Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ односвязного списка. Π‘Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΡƒΠΉΡ‚Π΅ всС ΡƒΠ·Π»Ρ‹ с Π½Π΅Ρ‡Π΅Ρ‚Π½Ρ‹ΠΌΠΈ индСксами вмСстС, Π° Π·Π°Ρ‚Π΅ΠΌ ΡƒΠ·Π»Ρ‹ с Ρ‡Π΅Ρ‚Π½Ρ‹ΠΌΠΈ индСксами, ΠΈ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ упорядочСнный список. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΡƒΠ·Π΅Π» считаСтся Π½Π΅Ρ‡Π΅Ρ‚Π½Ρ‹ΠΌ, Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΡƒΠ·Π΅Π» β€” Ρ‡Π΅Ρ‚Π½Ρ‹ΠΌ ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. Π£Ρ‡Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ порядок Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ±Π΅ΠΈΡ… Π³Ρ€ΡƒΠΏΠΏ (Ρ‡Π΅Ρ‚Π½ΠΎΠΉ ΠΈ Π½Π΅Ρ‡Π΅Ρ‚Π½ΠΎΠΉ) Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅, ΠΊΠ°ΠΊ Π² исходном спискС. Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ с Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠΎ памяти O(1) ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ O(n). ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: head = [2,1,3,5,6,4,7]
Output: [2,3,6,7,1,5,4]
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ: Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ odd ΠΈ even для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½Π΅Ρ‡Π΅Ρ‚Π½Ρ‹ΠΌΠΈ ΠΈ Ρ‡Π΅Ρ‚Π½Ρ‹ΠΌΠΈ ΡƒΠ·Π»Π°ΠΌΠΈ, соотвСтствСнно. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ odd Π½Π°Ρ‡Π°Π»ΠΎΠΌ списка head, Π° even β€” ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΡƒΠ·Π»ΠΎΠΌ head.next. Π’Π°ΠΊΠΆΠ΅ создайтС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ evenHead для сохранСния Π½Π°Ρ‡Π°Π»Π° Ρ‡Π΅Ρ‚Π½ΠΎΠ³ΠΎ списка. 2⃣РаздСлСниС списка: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ†ΠΈΠΊΠ» для прохоТдСния списка, пСрСнаправляя Π½Π΅Ρ‡Π΅Ρ‚Π½Ρ‹Π΅ ΡƒΠ·Π»Ρ‹ Π² oddList, Π° Ρ‡Π΅Ρ‚Π½Ρ‹Π΅ ΡƒΠ·Π»Ρ‹ Π² evenList. ΠžΠ±Π½ΠΎΠ²Π»ΡΠΉΡ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ odd ΠΈ even Π² процСссС ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ. 3⃣БоСдинСниС списков: ПослС окончания Ρ†ΠΈΠΊΠ»Π° соСдинитС ΠΊΠΎΠ½Π΅Ρ† Π½Π΅Ρ‡Π΅Ρ‚Π½ΠΎΠ³ΠΎ списка с Π½Π°Ρ‡Π°Π»ΠΎΠΌ Ρ‡Π΅Ρ‚Π½ΠΎΠ³ΠΎ списка, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ evenHead. 😎 РСшСниС:
public class ListNode {
    public int val;
    public ListNode next;
    public ListNode(int x) { val = x; }
}

public class Solution {
    public ListNode OddEvenList(ListNode head) {
        if (head == null) return null;
        ListNode odd = head, even = head.next, evenHead = even;
        
        while (even != null && even.next != null) {
            odd.next = even.next;
            odd = odd.next;
            even.next = odd.next;
            even = even.next;
        }
        odd.next = evenHead;
        return head;
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

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

Π—Π°Π΄Π°Ρ‡Π°: 240. Search a 2D Matrix II Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ эффСктивный Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡ‰Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ target Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ Ρ†Π΅
Π—Π°Π΄Π°Ρ‡Π°: 240. Search a 2D Matrix II Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ эффСктивный Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡ‰Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ target Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ Ρ†Π΅Π»Ρ‹Ρ… чисСл Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ m Π½Π° n. Π£ этой ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π΅ΡΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ свойства: Π¦Π΅Π»Ρ‹Π΅ числа Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строкС отсортированы ΠΏΠΎ Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°Π½ΠΈΡŽ слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ. Π¦Π΅Π»Ρ‹Π΅ числа Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ столбцС отсортированы ΠΏΠΎ Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°Π½ΠΈΡŽ свСрху Π²Π½ΠΈΠ·. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
Output: true
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹: ΠŸΠ΅Ρ€Π΅Π΄ Π½Π°Ρ‡Π°Π»ΠΎΠΌ поиска ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° Π½Π΅ пуста ΠΈ Π½Π΅ содСрТит null. 2βƒ£Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΡ ΠΏΠΎ диагоналям: Π˜Ρ‚Π΅Ρ€ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΠΎ диагоналям ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΈΠ½Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ отсортированности срСзов строк ΠΈ столбцов, начиная с Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ (строка, столбСц). Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚Π°ΠΊΠΎΠ³ΠΎ срСза ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск для нахоТдСния Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ значСния. 3⃣Бинарный поиск ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅: ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΠΉΡ‚Π΅ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ исчСрпаСтС всС Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ (Π² этом случаС возвращаСтся False) ΠΈΠ»ΠΈ ΠΏΠΎΠΊΠ° Π½Π΅ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Ρ†Π΅Π»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Π² этом случаС возвращаСтся True). Ѐункция Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ поиска Π΄ΠΎΠ»ΠΆΠ½Π° ΡƒΠΌΠ΅Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ с рядами, Ρ‚Π°ΠΊ ΠΈ с ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°ΠΌΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹. 😎 РСшСниС:
public class Solution {
    private bool BinarySearch(int[,] matrix, int target, int start, bool vertical) {
        int lo = start;
        int hi = vertical ? matrix.GetLength(1) - 1 : matrix.GetLength(0) - 1;

        while (hi >= lo) {
            int mid = (lo + hi) / 2;
            int value = vertical ? matrix[start, mid] : matrix[mid, start];
            if (value < target) {
                lo = mid + 1;
            } else if (value > target) {
                hi = mid - 1;
            } else {
                return true;
            }
        }
        return false;
    }

    public bool SearchMatrix(int[,] matrix, int target) {
        if (matrix == null || matrix.Length == 0) return false;

        int shorterDim = Math.Min(matrix.GetLength(0), matrix.GetLength(1));
        for (int i = 0; i < shorterDim; i++) {
            if (BinarySearch(matrix, target, i, true) || BinarySearch(matrix, target, i, false)) {
                return true;
            }
        }
        return false;
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ