uz
Feedback
PHP | LeetCode

PHP | LeetCode

Kanalga Telegram’da oβ€˜tish

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

Ko'proq ko'rsatish
1 355
Obunachilar
Ma'lumot yo'q24 soatlar
-67 kunlar
-930 kunlar
Postlar arxiv
Π—Π°Π΄Π°Ρ‡Π°: 725. Split Linked List in Parts Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Учитывая Π³ΠΎΠ»ΠΎΠ²Ρƒ односвязного списка ΠΈ Ρ†Π΅Π»ΠΎΠ΅ число k, Ρ€Π°Π·Π±Π΅ΠΉΡ‚Π΅ связн
Π—Π°Π΄Π°Ρ‡Π°: 725. Split Linked List in Parts Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Учитывая Π³ΠΎΠ»ΠΎΠ²Ρƒ односвязного списка ΠΈ Ρ†Π΅Π»ΠΎΠ΅ число k, Ρ€Π°Π·Π±Π΅ΠΉΡ‚Π΅ связный список Π½Π° k ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… частСй связного списка. Π”Π»ΠΈΠ½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ части Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ: Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ Π΄Π²Π΅ части Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€, ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΠΉΡΡ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ части Π±ΡƒΠ΄ΡƒΡ‚ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌΠΈ. Части Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π² порядкС появлСния Π²ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΌ спискС, ΠΈ части, появившиСся Ρ€Π°Π½ΡŒΡˆΠ΅, всСгда Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€, больший ΠΈΠ»ΠΈ Ρ€Π°Π²Π½Ρ‹ΠΉ частям, появившимся ΠΏΠΎΠ·ΠΆΠ΅. ВозвращаСтся массив ΠΈΠ· k частСй. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: head = [1,2,3], k = 5
Output: [[1],[2],[3],[],[]]
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ ΠΎΠ±Ρ‰ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ связного списка. 2⃣ВычислитС Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ части ΠΈ количСство частСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π½Π° ΠΎΠ΄Π½Ρƒ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ Π΄Π»ΠΈΠ½Π½Π΅Π΅. 3⃣РаздСлитС список Π½Π° части, присваивая ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π² массив Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². 😎 РСшСниС:
class ListNode {
    public $val = 0;
    public $next = null;
    function __construct($val = 0, $next = null) {
        $this->val = $val;
        $this->next = $next;
    }
}

function splitListToParts($root, $k) {
    $length = 0;
    $node = $root;
    while ($node != null) {
        $length++;
        $node = $node->next;
    }

    $partLength = intdiv($length, $k);
    $extraParts = $length % $k;

    $parts = array_fill(0, $k, null);
    $node = $root;
    for ($i = 0; $i < $k; $i++) {
        $partHead = $node;
        $partSize = $partLength + ($i < $extraParts ? 1 : 0);
        for ($j = 0; $j < $partSize - 1; $j++) {
            if ($node != null) {
                $node = $node->next;
            }
        }
        if ($node != null) {
            $nextPart = $node->next;
            $node->next = null;
            $node = $nextPart;
        }
        $parts[$i] = $partHead;
    }

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

Π—Π°Π΄Π°Ρ‡Π°: 301. Remove Invalid Parentheses Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: hard Π”Π°Π½Π° строка s, содСрТащая скобки ΠΈ Π±ΡƒΠΊΠ²Ρ‹. Π£Π΄Π°Π»ΠΈΡ‚Π΅ минимальноС количСс
Π—Π°Π΄Π°Ρ‡Π°: 301. Remove Invalid Parentheses Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: hard Π”Π°Π½Π° строка s, содСрТащая скобки ΠΈ Π±ΡƒΠΊΠ²Ρ‹. Π£Π΄Π°Π»ΠΈΡ‚Π΅ минимальноС количСство Π½Π΅Π²Π΅Ρ€Π½Ρ‹Ρ… скобок, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ строку допустимой. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ список ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… строк, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ допустимыми с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ количСством ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΉ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚ Π² любом порядкС. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: s = "()())()"
Output: ["(())()","()()()"]
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ: Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ массив, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ всС допустимыС выраТСния. НачнитС Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΡŽ с самой Π»Π΅Π²ΠΎΠΉ скобки Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ Π΄Π²ΠΈΠ³Π°ΠΉΡ‚Π΅ΡΡŒ Π²ΠΏΡ€Π°Π²ΠΎ. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ состояниС рСкурсии ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ index, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ индСкс Π² исходном Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ. Π’Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ left_count ΠΈ right_count для отслСТивания количСства Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… Π»Π΅Π²Ρ‹Ρ… ΠΈ ΠΏΡ€Π°Π²Ρ‹Ρ… скобок соотвСтствСнно. 2βƒ£ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ символа: Если Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ символ (S[i]) Π½Π΅ являСтся скобкой, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π΅Π³ΠΎ ΠΊ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡŽ для Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ рСкурсии. Если Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ символ являСтся скобкой (S[i] == '(' ΠΈΠ»ΠΈ S[i] == ')'), Ρƒ вас Π΅ΡΡ‚ΡŒ Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°: Π»ΠΈΠ±ΠΎ ΠΎΡ‚Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ этот символ ΠΊΠ°ΠΊ нСдопустимый, Π»ΠΈΠ±ΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ эту скобку ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ выраТСния. 3βƒ£Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ рСкурсии ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°: Когда всС скобки Π² исходном Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, являСтся Π»ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ допустимым, провСряя значСния left_count ΠΈ right_count (Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π½Ρ‹). Если Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ допустимо, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ количСство ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΉ (rem_count) ΠΈ сравнитС Π΅Π³ΠΎ с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ количСством ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΉ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… для получСния допустимого выраТСния Π΄ΠΎ сих ΠΏΠΎΡ€. Если Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ rem_count мСньшС, ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π½ΠΎΠ²ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² массив допустимых Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. 😎 РСшСниС:
class Solution {
    private $validExpressions;
    private $minimumRemoved;

    function __construct() {
        $this->validExpressions = [];
        $this->minimumRemoved = PHP_INT_MAX;
    }

    private function reset() {
        $this->validExpressions = [];
        $this->minimumRemoved = PHP_INT_MAX;
    }

    private function recurse($s, $index, $leftCount, $rightCount, $expression, $removedCount) {
        if ($index === strlen($s)) {
            if ($leftCount === $rightCount) {
                if ($removedCount <= $this->minimumRemoved) {
                    $possibleAnswer = implode('', $expression);
                    if ($removedCount < $this->minimumRemoved) {
                        $this->validExpressions = [];
                        $this->minimumRemoved = $removedCount;
                    }
                    $this->validExpressions[$possibleAnswer] = true;
                }
            }
            return;
        }

        $currentCharacter = $s[$index];
        $length = count($expression);

        if ($currentCharacter !== '(' && $currentCharacter !== ')') {
            array_push($expression, $currentCharacter);
            $this->recurse($s, $index + 1, $leftCount, $rightCount, $expression, $removedCount);
            array_pop($expression);
        } else {
            $this->recurse($s, $index + 1, $leftCount, $rightCount, $expression, $removedCount + 1);
            array_push($expression, $currentCharacter);

            if ($currentCharacter === '(') {
                $this->recurse($s, $index + 1, $leftCount + 1, $rightCount, $expression, $removedCount);
            } else if ($rightCount < $leftCount) {
                $this->recurse($s, $index + 1, $leftCount, $rightCount + 1, $expression, $removedCount);
            }

            array_pop($expression);
        }
    }

    function removeInvalidParentheses($s) {
        $this->reset();
        $this->recurse($s, 0, 0, 0, [], 0);
        return array_keys($this->validExpressions);
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 1235. Maximum Profit in Job Scheduling Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: hard Π£ нас Π΅ΡΡ‚ΡŒ n Π·Π°Π΄Π°Π½ΠΈΠΉ, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π·Π°Π΄Π°Π½ΠΈΠ΅ планируСтся Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΡ‚ startTime[i] Π΄ΠΎ endTime[i], ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ² ΠΏΡ€ΠΈΠ±Ρ‹Π»ΡŒ profit[i]. Π’Π°ΠΌ Π΄Π°Π½Ρ‹ массивы startTime, endTime ΠΈ profit, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΈΠ±Ρ‹Π»ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² подмноТСствС Π½Π΅ Π±Ρ‹Π»ΠΎ Π΄Π²ΡƒΡ… Π·Π°Π΄Π°Π½ΠΈΠΉ с ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌΡΡ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠΌ. Если Π²Ρ‹ Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚Π΅ Π·Π°Π΄Π°Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ заканчиваСтся Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ X, Π²Ρ‹ смоТСтС Π½Π°Ρ‡Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π·Π°Π΄Π°Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ начинаСтся Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ X. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: startTime = [1,2,3,3], endTime = [3,4,5,6], profit = [50,10,40,70]
Output: 120
πŸ‘¨β€πŸ’» Алгоритм: 1⃣Бортировка Π·Π°Π΄Π°Π½ΠΈΠΉ: Π‘Π½Π°Ρ‡Π°Π»Π° ΠΌΡ‹ сортируСм задания ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈΡ… окончания. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π½Π°ΠΌ Π»Π΅Π³ΠΊΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ задания ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π±Ρ€Π°Π½Ρ‹ Π±Π΅Π· пСрСсСчСния с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌΠΈ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΌΠΈ заданиями. 2βƒ£Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ динамичСского программирования с Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΌ поиском: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ массив dp, Π³Π΄Π΅ dp[i] Π±ΡƒΠ΄Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΈΠ±Ρ‹Π»ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ, рассматривая ΠΏΠ΅Ρ€Π²Ρ‹Π΅ i Π·Π°Π΄Π°Π½ΠΈΠΉ. 3⃣Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ задания ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π»ΠΈΠ±ΠΎ Π²Π·ΡΡ‚ΡŒ Π΅Π³ΠΎ, Π»ΠΈΠ±ΠΎ Π½Π΅ Π²Π·ΡΡ‚ΡŒ. Если ΠΌΡ‹ Π±Π΅Ρ€Π΅ΠΌ Π·Π°Π΄Π°Π½ΠΈΠ΅, ΠΌΡ‹ добавляСм Π΅Π³ΠΎ ΠΏΡ€ΠΈΠ±Ρ‹Π»ΡŒ ΠΊ максимальной ΠΏΡ€ΠΈΠ±Ρ‹Π»ΠΈ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΉ для Π·Π°Π΄Π°Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π΄ΠΎ Π½Π°Ρ‡Π°Π»Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ задания. Для нахоТдСния Ρ‚Π°ΠΊΠΈΡ… Π·Π°Π΄Π°Π½ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ поиск. 😎 РСшСниС:
function jobScheduling($startTime, $endTime, $profit) {
    $jobs = [];
    for ($i = 0; $i < count($startTime); $i++) {
        $jobs[] = [$endTime[$i], $startTime[$i], $profit[$i]];
    }
    usort($jobs, function($a, $b) {
        return $a[0] - $b[0];
    });

    $dp = [[0, 0]];

    foreach ($jobs as [$e, $s, $p]) {
        $i = 0;
        while ($i < count($dp) && $dp[$i][0] <= $s) $i++;
        $newProfit = $dp[$i - 1][1] + $p;
        if ($newProfit > $dp[count($dp) - 1][1]) {
            $dp[] = [$e, $newProfit];
        }
    }

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

Π—Π°Π΄Π°Ρ‡Π°: 210. Course Schedule II Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium ВсСго Π΅ΡΡ‚ΡŒ numCourses курсов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ, ΠΏΡ€ΠΎΠ½ΡƒΠΌΠ΅Ρ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ 0 Π΄ΠΎ numCourses - 1. Π’Π°ΠΌ Π΄Π°Π½ массив prerequisites, Π³Π΄Π΅ prerequisites[i] = [ai, bi] ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ сначала ΠΏΡ€ΠΎΠΉΡ‚ΠΈ курс bi, Ссли Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Π·ΡΡ‚ΡŒ курс ai. НапримСр, ΠΏΠ°Ρ€Π° [0, 1] ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ для прохоТдСния курса 0 сначала Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ курс 1. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ порядок курсов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ всС курсы. Если сущСствуСт нСсколько ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ², Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ любой ΠΈΠ· Π½ΠΈΡ…. Если Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ всС курсы, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ пустой массив. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: numCourses = 4, prerequisites = [[1,0],[2,0],[3,1],[3,2]]
Output: [0,2,1,3]
ОбъяснСниС: ВсСго Π΅ΡΡ‚ΡŒ 4 курса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ. Π§Ρ‚ΠΎΠ±Ρ‹ Π²Π·ΡΡ‚ΡŒ курс 3, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ ΠΎΠ±Π° курса 1 ΠΈ 2. Оба курса 1 ΠΈ 2 Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ взяты послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚Π΅ курс 0.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Ρ… порядков курсов β€” [0,1,2,3]. Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ порядок β€” [0,2,1,3].
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΈ построСниС Π³Ρ€Π°Ρ„Π°: Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ стСк S, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ топологичСски отсортированный порядок курсов Π² нашСм Π³Ρ€Π°Ρ„Π΅. ΠŸΠΎΡΡ‚Ρ€ΠΎΠΉΡ‚Π΅ список смСТности, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΠ°Ρ€Ρ‹ Ρ€Π΅Π±Π΅Ρ€, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π½Π° Π²Ρ…ΠΎΠ΄Π΅. Π’Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠ°Ρ€Π° Π²ΠΈΠ΄Π° [a, b] ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ курс b Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠΉΠ΄Π΅Π½, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π·ΡΡ‚ΡŒ курс a. Π­Ρ‚ΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ Ρ€Π΅Π±Ρ€ΠΎ Π²ΠΈΠ΄Π° b βž” a. Π£Ρ‡Ρ‚ΠΈΡ‚Π΅ это ΠΏΡ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°. 2⃣Запуск поиска Π² Π³Π»ΡƒΠ±ΠΈΠ½Ρƒ (DFS): Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° Π² нашСм Π³Ρ€Π°Ρ„Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ поиск Π² Π³Π»ΡƒΠ±ΠΈΠ½Ρƒ (DFS), Ссли этот ΡƒΠ·Π΅Π» Π΅Ρ‰Π΅ Π½Π΅ Π±Ρ‹Π» посСщСн Π²ΠΎ врСмя DFS Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΡƒΠ·Π»Π°. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ выполняСм поиск Π² Π³Π»ΡƒΠ±ΠΈΠ½Ρƒ для ΡƒΠ·Π»Π° N. РСкурсивно ΠΎΠ±ΠΎΠΉΠ΄ΠΈΡ‚Π΅ всСх сосСдСй ΡƒΠ·Π»Π° N, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΅Ρ‰Π΅ Π½Π΅ Π±Ρ‹Π»ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹. 3βƒ£ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΡƒΠ·Π»ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°: ПослС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ всСх сосСдСй Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΡƒΠ·Π΅Π» N Π² стСк. ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ стСк для модСлирования Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ порядка. Когда ΠΌΡ‹ добавляСм ΡƒΠ·Π΅Π» N Π² стСк, всС ΡƒΠ·Π»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ ΡƒΠ·Π΅Π» N Π² качСствС ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²Π΅Π½Π½ΠΈΠΊΠ° (срСди Π΄Ρ€ΡƒΠ³ΠΈΡ…), ΡƒΠΆΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ Π² стСкС. ПослС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ всСх ΡƒΠ·Π»ΠΎΠ² просто Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ ΡƒΠ·Π»Ρ‹ Π² порядкС ΠΈΡ… присутствия Π² стСкС ΠΎΡ‚ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ Π΄ΠΎ основания. 😎 РСшСниС:
class Solution {
    const WHITE = 1;
    const GRAY = 2;
    const BLACK = 3;

    public function findOrder($numCourses, $prerequisites) {
        $isPossible = true;
        $color = array_fill(0, $numCourses, self::WHITE);
        $adjList = [];
        $topologicalOrder = [];

        foreach ($prerequisites as $relation) {
            list($dest, $src) = $relation;
            if (!isset($adjList[$src])) {
                $adjList[$src] = [];
            }
            $adjList[$src][] = $dest;
        }

        for ($i = 0; $i < $numCourses && $isPossible; $i++) {
            if ($color[$i] == self::WHITE) {
                $this->dfs($i, $color, $adjList, $isPossible, $topologicalOrder);
            }
        }

        if ($isPossible) {
            $order = array_reverse($topologicalOrder);
            return $order;
        } else {
            return [];
        }
    }

    private function dfs($node, &$color, &$adjList, &$isPossible, &$topologicalOrder) {
        if (!$isPossible) return;
        $color[$node] = self::GRAY;

        if (isset($adjList[$node])) {
            foreach ($adjList[$node] as $neighbor) {
                if ($color[$neighbor] == self::WHITE) {
                    $this->dfs($neighbor, $color, $adjList, $isPossible, $topologicalOrder);
                } else if ($color[$neighbor] == self::GRAY) {
                    $isPossible = false;
                }
            }
        }

        $color[$node] = self::BLACK;
        $topologicalOrder[] = $node;
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 401. Binary Watch Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: easy Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ часы ΠΈΠΌΠ΅ΡŽΡ‚ 4 свСтодиода свСрху для прСдставлСния часов (0-11) ΠΈ 6 свСтодио
Π—Π°Π΄Π°Ρ‡Π°: 401. Binary Watch Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: easy Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ часы ΠΈΠΌΠ΅ΡŽΡ‚ 4 свСтодиода свСрху для прСдставлСния часов (0-11) ΠΈ 6 свСтодиодов снизу для прСдставлСния ΠΌΠΈΠ½ΡƒΡ‚ (0-59). ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ свСтодиод прСдставляСт ноль ΠΈΠ»ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ, ΠΏΡ€ΠΈ этом младший разряд находится справа. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: turnedOn = 1
Output: ["0:01","0:02","0:04","0:08","0:16","0:32","1:00","2:00","4:00","8:00"]
πŸ‘¨β€πŸ’» Алгоритм: 1⃣ГСнСрация всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ: ΠŸΠ΅Ρ€Π΅Π±Π΅Ρ€ΠΈΡ‚Π΅ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ значСния для часов ΠΈ ΠΌΠΈΠ½ΡƒΡ‚. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ для подсчСта количСства Π΅Π΄ΠΈΠ½ΠΈΡ† Π² Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΌ прСдставлСнии числа. 2βƒ£ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° количСства горящих свСтодиодов: Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, соотвСтствуСт Π»ΠΈ сумма Π΅Π΄ΠΈΠ½ΠΈΡ† Π² Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΌ прСдставлСнии часов ΠΈ ΠΌΠΈΠ½ΡƒΡ‚ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ количСству горящих свСтодиодов. 3⃣ЀорматированиС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°: Если комбинация часов ΠΈ ΠΌΠΈΠ½ΡƒΡ‚ соотвСтствуСт ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ, ΠΎΡ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΈΡ… Π² Π²ΠΈΠ΄Π΅ строки "часы:ΠΌΠΈΠ½ΡƒΡ‚Ρ‹" ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² список Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². 😎 РСшСниС:
class Solution {
    function readBinaryWatch($turnedOn) {
        $results = [];
        for ($h = 0; $h < 12; $h++) {
            for ($m = 0; $m < 60; $m++) {
                if (substr_count(decbin($h), '1') + substr_count(decbin($m), '1') == $turnedOn) {
                    $results[] = sprintf("%d:%02d", $h, $m);
                }
            }
        }
        return $results;
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 600. Non-negative Integers without Consecutive Ones Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: Hard Π”Π°Π½ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ число n, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ количСство чисСл Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ [0, n], Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ прСдставлСния ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ содСрТат ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΅Π΄ΠΈΠ½ΠΈΡ†. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: n = 5
Output: 5
Explanation:
Here are the non-negative integers <= 5 with their corresponding binary representations:
0 : 0
1 : 1
2 : 10
3 : 11
4 : 100
5 : 101
Among them, only integer 3 disobeys the rule (two consecutive ones) and the other 5 satisfy the rule. 
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€Π΅ всСх чисСл ΠΎΡ‚ 1 Π΄ΠΎ num. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ числа провСряСм всС сосСдниС ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, содСрТит Π»ΠΈ число Π΄Π²Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹. Если Π½Π΅ содСрТит, ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ количСство чисСл Π±Π΅Π· ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΅Π΄ΠΈΠ½ΠΈΡ†. 2⃣Чтобы ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, сущСствуСт Π»ΠΈ 1 Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ x (считая ΠΎΡ‚ младшСго Π·Π½Π°Ρ‡Π°Ρ‰Π΅Π³ΠΎ Π±ΠΈΡ‚Π°), Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ числС n, поступаСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π‘Π΄Π²ΠΈΠ³Π°Π΅ΠΌ Π΄Π²ΠΎΠΈΡ‡Π½ΡƒΡŽ 1 xβˆ’1 Ρ€Π°Π· Π²Π»Π΅Π²ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ число y, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ 1 Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° x-ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ. ЛогичСскоС И числа n ΠΈ y даст Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ 1 Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли n содСрТит 1 Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ x. 3⃣В ΠΊΠΎΠ½Ρ†Π΅ подсчитываСм ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ количСство чисСл Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ [0, n], Π½Π΅ содСрТащих ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΅Π΄ΠΈΠ½ΠΈΡ†. 😎 РСшСниС:
class Solution {
    function findIntegers($num) {
        $count = 0;
        for ($i = 0; $i <= $num; $i++) {
            if ($this->check($i)) {
                $count++;
            }
        }
        return $count;
    }

    function check($n) {
        $i = 31;
        while ($i > 0) {
            if (($n & (1 << $i)) != 0 && ($n & (1 << ($i - 1))) != 0) {
                return false;
            }
            $i--;
        }
        return true;
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

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

    function outerTrees($points) {
        usort($points, function($a, $b) {
            return $a[0] === $b[0] ? $a[1] - $b[1] : $a[0] - $b[0];
        });

        $hull = [];

        foreach ($points as $point) {
            while (count($hull) >= 2 && $this->orientation($hull[count($hull) - 2], $hull[count($hull) - 1], $point) > 0) {
                array_pop($hull);
            }
            $hull[] = $point;
        }

        array_pop($hull);

        for ($i = count($points) - 1; $i >= 0; $i--) {
            while (count($hull) >= 2 && $this->orientation($hull[count($hull) - 2], $hull[count($hull) - 1], $points[$i]) > 0) {
                array_pop($hull);
            }
            $hull[] = $points[$i];
        }

        $uniqueHull = [];
        foreach ($hull as $h) {
            $uniqueHull[implode(',', $h)] = $h;
        }

        return array_values($uniqueHull);
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 269. Alien Dictionary Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: hard Π•ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΈΠ½ΠΎΠΏΠ»Π°Π½Π΅Ρ‚Π½Ρ‹ΠΉ язык, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ английский Π°Π»Ρ„Π°Π²ΠΈΡ‚. Однако порядок Π±ΡƒΠΊΠ² Π² Π½Π΅ΠΌ нСизвСстСн. Π’Π°ΠΌ Π΄Π°Π½ список строк words ΠΈΠ· словаря ΠΈΠ½ΠΎΠΏΠ»Π°Π½Π΅Ρ‚Π½ΠΎΠ³ΠΎ языка. УтвСрТдаСтся, Ρ‡Ρ‚ΠΎ строки Π² words отсортированы лСксикографичСски ΠΏΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ этого Π½ΠΎΠ²ΠΎΠ³ΠΎ языка. Если это ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π΅Π²Π΅Ρ€Π½ΠΎ ΠΈ Π΄Π°Π½Π½ΠΎΠ΅ располоТСниС строк Π² words Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΎΠΌΡƒ порядку Π±ΡƒΠΊΠ², Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ "". Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ строку ΠΈΠ· ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… Π±ΡƒΠΊΠ² Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΈΠ½ΠΎΠΏΠ»Π°Π½Π΅Ρ‚Π½ΠΎΠ³ΠΎ языка, отсортированных Π² лСксикографичСском порядкС ΠΏΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ Π½ΠΎΠ²ΠΎΠ³ΠΎ языка. Если сущСствуСт нСсколько Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ любоС ΠΈΠ· Π½ΠΈΡ…. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: words = ["wrt","wrf","er","ett","rftt"]
Output: "wertf"
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ порядка ΠΈ созданиС списков смСТности: Π˜Π·Π²Π»Π΅Ρ‡ΡŒ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ порядка ΠΌΠ΅ΠΆΠ΄Ρƒ Π±ΡƒΠΊΠ²Π°ΠΌΠΈ ΠΈΠ· слов. Π’ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈΡ… Π² список смСТности, обрабатывая случаи, ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄Π½ΠΎ слово являСтся прСфиксом Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ. 2βƒ£ΠŸΠΎΠ΄ΡΡ‡Π΅Ρ‚ числа входящих Ρ€Π΅Π±Π΅Ρ€: ΠŸΠΎΠ΄ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ количСство входящих Ρ€Π΅Π±Π΅Ρ€ (in-degree) для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π±ΡƒΠΊΠ²Ρ‹. ΠŸΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ исходящий список смСТности ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ входящиС Ρ€Π΅Π±Ρ€Π° для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π±ΡƒΠΊΠ²Ρ‹. 3βƒ£ΠžΠ±Ρ…ΠΎΠ΄ Π² ΡˆΠΈΡ€ΠΈΠ½Ρƒ (BFS): Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π±ΡƒΠΊΠ²Π°ΠΌΠΈ с Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ in-degree. Π’Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ BFS, добавляя Π±ΡƒΠΊΠ²Ρ‹ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, ΠΊΠΎΠ³Π΄Π° ΠΈΡ… in-degree становится Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ. ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π½Π΅ станСт пустой. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Ρ†ΠΈΠΊΠ»ΠΎΠ² ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. 😎 РСшСниС:
function alienOrder($words) {
    $adjList = [];
    $inDegree = [];

    foreach ($words as $word) {
        foreach (str_split($word) as $char) {
            $inDegree[$char] = 0;
        }
    }

    for ($i = 0; $i < count($words) - 1; $i++) {
        $firstWord = $words[$i];
        $secondWord = $words[$i + 1];
        for ($j = 0; $j < min(strlen($firstWord), strlen($secondWord)); $j++) {
            $c = $firstWord[$j];
            $d = $secondWord[$j];
            if ($c !== $d) {
                if (!isset($adjList[$c])) {
                    $adjList[$c] = [];
                }
                if (!in_array($d, $adjList[$c])) {
                    $adjList[$c][] = $d;
                    $inDegree[$d]++;
                }
                break;
            }
        }
        if (strlen($secondWord) < strlen($firstWord) && strpos($firstWord, $secondWord) === 0) {
            return "";
        }
    }

    $output = [];
    $queue = [];

    foreach ($inDegree as $char => $degree) {
        if ($degree == 0) {
            $queue[] = $char;
        }
    }

    while (!empty($queue)) {
        $c = array_shift($queue);
        $output[] = $c;
        if (isset($adjList[$c])) {
            foreach ($adjList[$c] as $d) {
                $inDegree[$d]--;
                if ($inDegree[$d] == 0) {
                    $queue[] = $d;
                }
            }
        }
    }

    if (count($output) < count($inDegree)) {
        return "";
    }

    return implode("", $output);
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 421. Maximum XOR of Two Numbers in an Array Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ цСлочислСнный массив nums, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ nums[i] XOR nums[j], Π³Π΄Π΅ 0 <= i <= j < n. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: nums = [3,10,5,25,2,8]
Output: 28
Explanation: The maximum result is 5 XOR 25 = 28.
πŸ‘¨β€πŸ’» Алгоритм: 1⃣ВычислитС количСство Π±ΠΈΡ‚ΠΎΠ² L для использования. Π­Ρ‚ΠΎ Π΄Π»ΠΈΠ½Π° максимального числа Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ прСдставлСнии. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ max_xor = 0. 2⃣ЗапуститС Ρ†ΠΈΠΊΠ» ΠΎΡ‚ i = Lβˆ’1 Π΄ΠΎ i = 0 (ΠΎΡ‚ самого Π»Π΅Π²ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π° Lβˆ’1 Π΄ΠΎ самого ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ Π±ΠΈΡ‚Π° 0): Π‘Π΄Π²ΠΈΠ³Π°ΠΉΡ‚Π΅ max_xor Π²Π»Π΅Π²ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π±ΠΈΡ‚. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ curr_xor = max_xor | 1, установив 1 Π² самом ΠΏΡ€Π°Π²ΠΎΠΌ Π±ΠΈΡ‚Π΅ max_xor. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ curr_xor, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ доступныС прСфиксы. 3⃣ВычислитС всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ прСфиксы Π΄Π»ΠΈΠ½Ρ‹ Lβˆ’i, итСрируя ΠΏΠΎ nums: ΠŸΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚Π΅ Π² HashSet прСфиксы прСфикс Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ числа Π΄Π»ΠΈΠ½ΠΎΠΉ Lβˆ’i: num >> i. Π˜Ρ‚Π΅Ρ€ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΠΎ всСм прСфиксам ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ curr_xor, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΄Π²Π° ΠΈΠ· Π½ΠΈΡ…: p1 ^ p2 == curr_xor. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ свойство самопрСобразования XOR p1 ^ p2 ^ p2 = p1, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ это ΠΊΠ°ΠΊ p1 == curr_xor ^ p2 ΠΈ просто ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ p, Ссли curr_xor ^ p Π΅ΡΡ‚ΡŒ Π² прСфиксах. Если Ρ‚Π°ΠΊ, установитС max_xor Ρ€Π°Π²Π½Ρ‹ΠΌ curr_xor, Ρ‚.Π΅. установитС 1-Π±ΠΈΡ‚ Π² самом ΠΏΡ€Π°Π²ΠΎΠΌ Π±ΠΈΡ‚Π΅. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС, ΠΏΡƒΡΡ‚ΡŒ max_xor оставит 0-Π±ΠΈΡ‚ Π² самом ΠΏΡ€Π°Π²ΠΎΠΌ Π±ΠΈΡ‚Π΅. 😎 РСшСниС:
class Solution {
    function findMaximumXOR($nums) {
        $maxNum = $nums[0];
        foreach ($nums as $num) {
            if ($num > $maxNum) {
                $maxNum = $num;
            }
        }
        $L = strlen(decbin($maxNum));

        $maxXor = 0;
        for ($i = $L - 1; $i >= 0; $i--) {
            $maxXor <<= 1;
            $currXor = $maxXor | 1;
            $prefixes = [];
            foreach ($nums as $num) {
                $prefixes[$num >> $i] = true;
            }
            foreach ($prefixes as $p => $true) {
                if (isset($prefixes[$currXor ^ $p])) {
                    $maxXor = $currXor;
                    break;
                }
            }
        }
        return $maxXor;
    }
}
?>
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 1275. Find Winner on a Tic Tac Toe Game Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: easy Π’ ΠΈΠ³Ρ€Ρƒ "ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Π½ΠΎΠ»ΠΈΠΊΠΈ" ΠΈΠ³Ρ€Π°ΡŽΡ‚ Π΄Π²Π° ΠΈΠ³Ρ€ΠΎΠΊΠ° A ΠΈ B Π½Π° сСткС 3 x 3. ΠŸΡ€Π°Π²ΠΈΠ»Π° ΠΈΠ³Ρ€Ρ‹ "ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Π½ΠΎΠ»ΠΈΠΊΠΈ" Ρ‚Π°ΠΊΠΎΠ²Ρ‹: ΠΈΠ³Ρ€ΠΎΠΊΠΈ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ символы Π² пустыС ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Ρ‹ ' '. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΠ³Ρ€ΠΎΠΊ A всСгда ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ символы "X", Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΈΠ³Ρ€ΠΎΠΊ B - "O". Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹ "X" ΠΈ "O" всСгда ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² пустыС ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Ρ‹, Π° Π½Π΅ Π² Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Π΅. Π˜Π³Ρ€Π° заканчиваСтся, ΠΊΠΎΠ³Π΄Π° Ρ‚Ρ€ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… (нСпустых) символа Π·Π°ΠΏΠΎΠ»Π½ΡΡŽΡ‚ Π»ΡŽΠ±ΡƒΡŽ строку, столбСц ΠΈΠ»ΠΈ диагональ. Π˜Π³Ρ€Π° Ρ‚Π°ΠΊΠΆΠ΅ заканчиваСтся, Ссли всС ΠΊΠ»Π΅Ρ‚ΠΊΠΈ нСпустыС. Π‘ΠΎΠ»ΡŒΡˆΠ΅ Ρ…ΠΎΠ΄ΠΎΠ² Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сыграно, Ссли ΠΈΠ³Ρ€Π° Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Π°. Учитывая Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ цСлочислСнный массив moves, Π³Π΄Π΅ moves[i] = [rowi, coli] ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ i-ΠΉ Ρ…ΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ сыгран Π½Π° сСткС[rowi][coli]. Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ побСдитСля ΠΈΠ³Ρ€Ρ‹, Ссли ΠΎΠ½ сущСствуСт (A ΠΈΠ»ΠΈ B). Если ΠΈΠ³Ρ€Π° Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»Π°ΡΡŒ Π²Π½ΠΈΡ‡ΡŒΡŽ, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ "ΠΠΈΡ‡ΡŒΡ". Если Π΅Ρ‰Π΅ Π΅ΡΡ‚ΡŒ Ρ…ΠΎΠ΄Ρ‹ для ΠΈΠ³Ρ€Ρ‹, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ "Pending". МоТно ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ…ΠΎΠ΄Ρ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ (Ρ‚.Π΅. ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ ΠΈΠ³Ρ€Ρ‹ Π² ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Π½ΠΎΠ»ΠΈΠΊΠΈ), сСтка ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ пуста, ΠΈ A Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ³Ρ€Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: moves = [[0,0],[2,0],[1,1],[2,1],[2,2]]
Output: "A"
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΡƒΡΡ‚ΡƒΡŽ 3x3 сСтку. 2βƒ£ΠŸΡ€ΠΎΠΉΠ΄ΠΈΡ‚Π΅ ΠΏΠΎ списку Ρ…ΠΎΠ΄ΠΎΠ² ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ сСтку Π² соотвСтствии с Ρ…ΠΎΠ΄Π°ΠΌΠΈ ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² A ΠΈ B. 3βƒ£ΠŸΠΎΡΠ»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ…ΠΎΠ΄Π° провСряйтС, Π΅ΡΡ‚ΡŒ Π»ΠΈ ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚Π΅Π»ΡŒ. Если всС Ρ…ΠΎΠ΄Ρ‹ сдСланы ΠΈ Π½Π΅Ρ‚ побСдитСля, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π° Π»ΠΈ ΠΈΠ³Ρ€Π° Π²Π½ΠΈΡ‡ΡŒΡŽ ΠΈΠ»ΠΈ Π΅Ρ‰Π΅ Π΅ΡΡ‚ΡŒ Ρ…ΠΎΠ΄Ρ‹. 😎 РСшСниС:
function tictactoe($moves) {
    $grid = array_fill(0, 3, array_fill(0, 3, ''));
    for ($i = 0; $i < count($moves); $i++) {
        $r = $moves[$i][0];
        $c = $moves[$i][1];
        $grid[$r][$c] = $i % 2 == 0 ? 'X' : 'O';
    }

    for ($i = 0; $i < 3; $i++) {
        if ($grid[$i][0] == $grid[$i][1] && $grid[$i][1] == $grid[$i][2] && $grid[$i][0] != '')
            return $grid[$i][0] == 'X' ? 'A' : 'B';
        if ($grid[0][$i] == $grid[1][$i] && $grid[1][$i] == $grid[2][$i] && $grid[0][$i] != '')
            return $grid[0][$i] == 'X' ? 'A' : 'B';
    }

    if ($grid[0][0] == $grid[1][1] && $grid[1][1] == $grid[2][2] && $grid[0][0] != '')
        return $grid[0][0] == 'X' ? 'A' : 'B';
    if ($grid[0][2] == $grid[1][1] && $grid[1][1] == $grid[2][0] && $grid[0][2] != '')
        return $grid[0][2] == 'X' ? 'A' : 'B';

    return count($moves) == 9 ? 'Draw' : 'Pending';
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 273. Integer to English Words Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: hard ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠΉΡ‚Π΅ Π½Π΅ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ число num Π² Π΅Π³ΠΎ словСсноС прСдставлСниС Π½Π° английском языкС. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: num = 123
Output: "One Hundred Twenty Three"
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° чисСл Π΄ΠΎ 20 ΠΈ ΠΊΡ€Π°Ρ‚Π½Ρ‹Ρ… 10 Π΄ΠΎ 90: Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ массивы ΠΈΠ»ΠΈ словари для чисСл ΠΎΡ‚ 1 Π΄ΠΎ 19 ΠΈ для ΠΊΡ€Π°Ρ‚Π½Ρ‹Ρ… 10 ΠΎΡ‚ 20 Π΄ΠΎ 90. Если число ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² эти Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ‹, сразу Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ словСсноС прСдставлСниС. 2βƒ£ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° сотСн, тысяч, ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠ² ΠΈ ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄ΠΎΠ²: Π Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ число Π½Π° Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΏΠΎ Ρ‚Ρ€ΠΈ Ρ†ΠΈΡ„Ρ€Ρ‹ (Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹, тысячи, ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Ρ‹, ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄Ρ‹). Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ словСсноС прСдставлСниС с использованиСм рСкурсивной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для чисСл ΠΎΡ‚ 1 Π΄ΠΎ 999. 3⃣ЀормированиС ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°: Π‘ΠΎΠ±Ρ€Π°Ρ‚ΡŒ словСсноС прСдставлСниС всСх Π³Ρ€ΡƒΠΏΠΏ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ суффиксы (тысячи, ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Ρ‹, ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄Ρ‹). Π‘ΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ всС части Π² ΠΎΠ΄Π½Ρƒ строку, ΡƒΠ΄Π°Π»ΠΈΠ² лишниС ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹. 😎 РСшСниС:
class Solution {
    private $belowTwenty = ["", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"];
    private $tens = ["", "Ten", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"];
    private $thousands = ["", "Thousand", "Million", "Billion"];
    
    function numberToWords($num) {
        if ($num == 0) return "Zero";
        $result = "";
        $i = 0;
        
        while ($num > 0) {
            if ($num % 1000 != 0) {
                $result = $this->helper($num % 1000) . $this->thousands[$i] . " " . $result;
            }
            $num = intval($num / 1000);
            $i++;
        }
        return trim($result);
    }

    private function helper($num) {
        if ($num == 0) return "";
        else if ($num < 20) return $this->belowTwenty[$num] . " ";
        else if ($num < 100) return $this->tens[intval($num / 10)] . " " . $this->helper($num % 10);
        else return $this->belowTwenty[intval($num / 100)] . " Hundred " . $this->helper($num % 100);
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 1356. Sort Integers by The Number of 1 Bits Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: easy Π”Π°Π½ цСлочислСнный массив arr. ΠžΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ Ρ†Π΅Π»Ρ‹Π΅ числа Π² массивС ΠΏΠΎ Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°Π½ΠΈΡŽ числа Π΅Π΄ΠΈΠ½ΠΈΡ† Π² ΠΈΡ… Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ прСдставлСнии, Π° Π² случаС, Ссли Ρƒ Π΄Π²ΡƒΡ… ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ чисСл ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ количСство Π΅Π΄ΠΈΠ½ΠΈΡ†, отсортируйтС ΠΈΡ… ΠΏΠΎ Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°Π½ΠΈΡŽ. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ массив послС сортировки. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: arr = [1024,512,256,128,64,32,16,8,4,2,1]
Output: [1,2,4,8,16,32,64,128,256,512,1024]
Explantion: All integers have 1 bit in the binary representation, you should just sort them in ascending order.
πŸ‘¨β€πŸ’» Алгоритм: 1⃣БозданиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для подсчСта Π΅Π΄ΠΈΠ½ΠΈΡ†: Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ†Π΅Π»ΠΎΠ΅ число ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ количСство Π΅Π΄ΠΈΠ½ΠΈΡ† Π² Π΅Π³ΠΎ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ прСдставлСнии. 2⃣Бортировка массива: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π²ΡΡ‚Ρ€ΠΎΠ΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ сортировки, пСрСдавая Π΅ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ сравнСния, которая ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ количСство Π΅Π΄ΠΈΠ½ΠΈΡ† Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ прСдставлСнии чисСл для сортировки. Если количСство Π΅Π΄ΠΈΠ½ΠΈΡ† ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ само число для сортировки. 3⃣Возврат отсортированного массива: Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ отсортированный массив. 😎 РСшСниС:
class Solution {
    function sortByBits($arr) {
        usort($arr, function($a, $b) {
            $countA = substr_count(decbin($a), '1');
            $countB = substr_count(decbin($b), '1');
            return $countA === $countB ? $a - $b : $countA - $countB;
        });
        return $arr;
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 971. Flip Binary Tree To Match Preorder Traversal Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ΠΎ ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ с n ΡƒΠ·Π»Π°ΠΌΠΈ, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΡƒΠ·Π»Ρƒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎ присвоСно Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚ 1 Π΄ΠΎ n. Π’Π°ΠΊΠΆΠ΅ Π΄Π°Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ· n Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ voyage, которая являСтся ΠΆΠ΅Π»Π°Π΅ΠΌΡ‹ΠΌ ΠΎΠ±Ρ…ΠΎΠ΄ΠΎΠΌ Π΄Π΅Ρ€Π΅Π²Π° Π² порядкС pre-order. Π›ΡŽΠ±ΠΎΠΉ ΡƒΠ·Π΅Π» Π² Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΌ Π΄Π΅Ρ€Π΅Π²Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ, помСняв мСстами Π΅Π³ΠΎ Π»Π΅Π²ΠΎΠ΅ ΠΈ ΠΏΡ€Π°Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΡŒΡ. НапримСр, ΠΏΠ΅Ρ€Π΅Π²ΠΎΡ€ΠΎΡ‚ ΡƒΠ·Π»Π° 1 Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ эффСкт: ΠŸΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ минимальноС количСство ΡƒΠ·Π»ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ…ΠΎΠ΄ Π΄Π΅Ρ€Π΅Π²Π° Π² порядкС pre-order соотвСтствовал voyage. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ список Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ всСх ΠΏΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΡƒΡ‚Ρ‹Ρ… ΡƒΠ·Π»ΠΎΠ². Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚ Π² любом порядкС. Если Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΡƒΠ·Π»Ρ‹ Π² Π΄Π΅Ρ€Π΅Π²Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠ±Ρ…ΠΎΠ΄ Π² порядкС pre-order ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ voyage, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ список [-1]. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: root = [1,2], voyage = [2,1]
Output: [-1]
Explanation: It is impossible to flip the nodes such that the pre-order traversal matches voyage.
πŸ‘¨β€πŸ’» Алгоритм: 1⃣ВыполнитС поиск Π² Π³Π»ΡƒΠ±ΠΈΠ½Ρƒ. Если Π² ΠΊΠ°ΠΊΠΎΠΌ-Π»ΠΈΠ±ΠΎ ΡƒΠ·Π»Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠ·Π»Π° Π½Π΅ соотвСтствуСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ Π² voyage, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ [-1]. 2βƒ£Π˜Π½Π°Ρ‡Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅, ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ: Ссли ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΠΎΠ΅ число Π² voyage (voyage[i]) отличаСтся ΠΎΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°. 3βƒ£ΠŸΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ ΡƒΠ·Π΅Π», Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² список ΠΏΠ΅Ρ€Π΅Π²Π΅Ρ€Π½ΡƒΡ‚Ρ‹Ρ… ΡƒΠ·Π»ΠΎΠ² ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅ ΠΎΠ±Ρ…ΠΎΠ΄ Π΄Π΅Ρ€Π΅Π²Π°, ΠΏΠΎΠΊΠ° вСсь порядок ΠΎΠ±Ρ…ΠΎΠ΄Π° pre-order Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ voyage. 😎 РСшСниС:
class Solution {
    public $flipped;
    public $index;
    public $voyage;

    function flipMatchVoyage($root, $voyage) {
        $this->flipped = [];
        $this->index = 0;
        $this->voyage = $voyage;

        $this->dfs($root);
        if (!empty($this->flipped) && $this->flipped[0] == -1) {
            return [-1];
        }

        return $this->flipped;
    }

    function dfs($node) {
        if ($node !== null) {
            if ($node->val != $this->voyage[$this->index++]) {
                $this->flipped = [-1];
                return;
            }

            if ($this->index < count($this->voyage) && $node->left !== null && $node->left->val != $this->voyage[$this->index]) {
                $this->flipped[] = $node->val;
                $this->dfs($node->right);
                $this->dfs($node->left);
            } else {
                $this->dfs($node->left);
                $this->dfs($node->right);
            }
        }
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 121. Best Time to Buy and Sell Stock Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: easy Π’Π°ΠΌ Π΄Π°Π½ массив Ρ†Π΅Π½, Π³Π΄Π΅ prices[i] являСтся Ρ†Π΅Π½ΠΎΠΉ Π΄Π°Π½Π½ΠΎΠΉ Π°ΠΊΡ†ΠΈΠΈ Π²
Π—Π°Π΄Π°Ρ‡Π°: 121. Best Time to Buy and Sell Stock Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: easy Π’Π°ΠΌ Π΄Π°Π½ массив Ρ†Π΅Π½, Π³Π΄Π΅ prices[i] являСтся Ρ†Π΅Π½ΠΎΠΉ Π΄Π°Π½Π½ΠΎΠΉ Π°ΠΊΡ†ΠΈΠΈ Π² i-ΠΉ дСнь. Π’Π°ΡˆΠ° Π·Π°Π΄Π°Ρ‡Π° β€” ΠΌΠ°ΠΊΡΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Π°ΡˆΡƒ ΠΏΡ€ΠΈΠ±Ρ‹Π»ΡŒ, Π²Ρ‹Π±Ρ€Π°Π² ΠΎΠ΄ΠΈΠ½ дСнь для ΠΏΠΎΠΊΡƒΠΏΠΊΠΈ Π°ΠΊΡ†ΠΈΠΈ ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ дСнь Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ для Π΅Π΅ ΠΏΡ€ΠΎΠ΄Π°ΠΆΠΈ. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΈΠ±Ρ‹Π»ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡ‚ этой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Если ΠΏΡ€ΠΈΠ±Ρ‹Π»ΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ 0. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: prices = [7,1,5,3,6,4]
Output: 5
Explanation: Buy on day 2 (price = 1) and sell on day 5 (price = 6), profit = 6-1 = 5.
Note that buying on day 2 and selling on day 1 is not allowed because you must buy before you sell.
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ minPrice Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ PHP_INT_MAX, maxProfit β€” 0. 2βƒ£ΠŸΡ€ΠΎΡ…ΠΎΠ΄ΠΈΠΌ ΠΏΠΎ всСм Ρ†Π΅Π½Π°ΠΌ: Если тСкущая Ρ†Π΅Π½Π° мСньшС minPrice, обновляСм minPrice. Если тСкущая ΠΏΡ€ΠΈΠ±Ρ‹Π»ΡŒ (price - minPrice) большС maxProfit, обновляСм maxProfit. 3⃣ВозвращаСм maxProfit. 😎 РСшСниС:
class Solution {
    public function maxProfit($prices) {
        $minPrice = PHP_INT_MAX;
        $maxProfit = 0;
        foreach ($prices as $price) {
            if ($price < $minPrice) {
                $minPrice = $price;
            } elseif ($price - $minPrice > $maxProfit) {
                $maxProfit = $price - $minPrice;
            }
        }
        return $maxProfit;
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

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

        $this->radixSort($transformed);
        return $transformed;
    }

    private function radixSort(&$array) {
        $maxElement = max(array_map('abs', $array));
        $placeValue = 1;

        while ($maxElement / $placeValue > 0) {
            $this->countingSortByDigit($array, $placeValue);
            $placeValue *= 10;
        }

        $negatives = array_filter($array, function($x) { return $x < 0; });
        $positives = array_filter($array, function($x) { return $x >= 0; });
        sort($negatives);
        sort($positives);
        $array = array_merge($negatives, $positives);
    }

    private function countingSortByDigit(&$array, $placeValue) {
        $n = count($array);
        $output = array_fill(0, $n, 0);
        $count = array_fill(0, 10, 0);

        foreach ($array as $num) {
            $digit = (int)(abs($num) / $placeValue) % 10;
            $count[$digit]++;
        }

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

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

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

Π—Π°Π΄Π°Ρ‡Π°: 1319. Number of Operations to Make Network Connected Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ΠΎ n ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠ², ΠΏΡ€ΠΎΠ½ΡƒΠΌΠ΅Ρ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ 0 Π΄ΠΎ n - 1, соСдинённых Ethernet-кабСлями connections, ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΡΠ΅Ρ‚ΡŒ, Π³Π΄Π΅ connections[i] = [ai, bi] прСдставляСт собой соСдинСниС ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°ΠΌΠΈ ai ΠΈ bi. Π›ΡŽΠ±ΠΎΠΉ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ любого Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΈΠ»ΠΈ косвСнно Ρ‡Π΅Ρ€Π΅Π· ΡΠ΅Ρ‚ΡŒ. Π’Π°ΠΌ Π΄Π°Π½Ρ‹ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ соСдинСния сСти. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅ ΠΊΠ°Π±Π΅Π»ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ двумя Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ соСдинёнными ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°ΠΌΠΈ ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΈΡ… ΠΌΠ΅ΠΆΠ΄Ρƒ Π»ΡŽΠ±Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠΈ нСсоСдинённых ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΡ… Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ соСдинёнными. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ минимальноС количСство Ρ€Π°Π·, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ всС ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Ρ‹. Если это Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ -1. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: n = 4, connections = [[0,1],[0,2],[1,2]]
Output: 1
Explanation: Remove cable between computer 1 and 2 and place between computers 1 and 3.
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ connections. Если ΠΎΠ½ мСньшС n - 1, Ρƒ нас нСдостаточно Ρ€Π΅Π±Π΅Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ вСсь Π³Ρ€Π°Ρ„. Π’ этом случаС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ -1. 2⃣БоздайтС список смСТности с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ connections, Π³Π΄Π΅ adj[x] содСрТит всСх сосСдСй ΡƒΠ·Π»Π° x. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ†Π΅Π»ΠΎΠ΅ число numberOfConnectedComponents, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ количСство ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ связности Π² Π³Ρ€Π°Ρ„Π΅. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 0. 3⃣БоздайтС массив visit Π΄Π»ΠΈΠ½ΠΎΠΉ n для отслСТивания посСщСнных ΡƒΠ·Π»ΠΎΠ². ΠŸΡ€ΠΎΠΉΠ΄ΠΈΡ‚Π΅ ΠΏΠΎ всСм ΡƒΠ·Π»Π°ΠΌ, ΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° i ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Π±Ρ‹Π» Π»ΠΈ ΠΎΠ½ посСщСн. Если ΡƒΠ·Π΅Π» i Π½Π΅ Π±Ρ‹Π» посСщСн, ΡƒΠ²Π΅Π»ΠΈΡ‡ΡŒΡ‚Π΅ numberOfConnectedComponents Π½Π° 1 ΠΈ Π½Π°Ρ‡Π½ΠΈΡ‚Π΅ ΠΎΠ±Ρ…ΠΎΠ΄ DFS: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ dfs для выполнСния ΠΎΠ±Ρ…ΠΎΠ΄Π°. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΡƒΠ·Π΅Π», Ρ€Π΅Π±Ρ€Π° ΠΈ visit Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², начиная с ΡƒΠ·Π»Π° i. ΠžΡ‚ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅ ΡƒΠ·Π΅Π» ΠΊΠ°ΠΊ посСщСнный. ΠŸΡ€ΠΎΠΉΠ΄ΠΈΡ‚Π΅ΡΡŒ ΠΏΠΎ всСм сосСдям ΡƒΠ·Π»Π°. Если ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ сосСд Π΅Ρ‰Π΅ Π½Π΅ Π±Ρ‹Π» посСщСн, рСкурсивно Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ dfs с этим сосСдом Π² качСствС ΡƒΠ·Π»Π°. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ numberOfConnectedComponents - 1. 😎 РСшСниС:
class Solution {
    private function dfs($node, $adj, &$visit) {
        $visit[$node] = true;
        if (!isset($adj[$node])) {
            return;
        }
        foreach ($adj[$node] as $neighbor) {
            if (!$visit[$neighbor]) {
                $visit[$neighbor] = true;
                $this->dfs($neighbor, $adj, $visit);
            }
        }
    }

    function makeConnected($n, $connections) {
        if (count($connections) < $n - 1) {
            return -1;
        }

        $adj = [];
        foreach ($connections as $connection) {
            $adj[$connection[0]][] = $connection[1];
            $adj[$connection[1]][] = $connection[0];
        }

        $numberOfConnectedComponents = 0;
        $visit = array_fill(0, $n, false);
        for ($i = 0; $i < $n; $i++) {
            if (!$visit[$i]) {
                $numberOfConnectedComponents++;
                $this->dfs($i, $adj, $visit);
            }
        }

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

Repost from Backend
ΠŸΡ€ΠΈΠ²Π΅Ρ‚ рСбят! МнС Π² послСднСС врСмя ΠΏΠΈΡˆΠ΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ… ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚Π΅Π»Π΅ΠΉ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ ΠΈΡ… бизнСс со стороны. Π― ΠΊΠ°ΠΊ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ с 10 Π³ΠΎΠ΄Π°ΠΌΠΈ ΠΎΠΏΡ‹Ρ‚Π° Π² создании стартапов, ΠΊΠ°ΠΊ ΡƒΡΠΏΠ΅ΡˆΠΈΡ… Ρ‚Π°ΠΊ ΠΈ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ ΡƒΠ±Ρ‹Ρ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΌΠΎΠ³Ρƒ Π΄Π°Ρ‚ΡŒ свою ΠΎΡ†Π΅Π½ΠΊΡƒ. Π― ΠΏΡ€ΠΎΠ΄Π°Π²Π°Π» свой бизнСс Π² ΠΏΡ€ΠΈΠ±Ρ‹Π»ΡŒ, ΠΈ я Ρ‚Π°ΠΊΠΆΠ΅ Π² ΡƒΠ±Ρ‹Ρ‚ΠΎΠΊ ΠΏΡ€ΠΎΠ΄ΠΎΠ²Π°Π» нСсколько своих ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ². Π“ΠΎΡ‚ΠΎΠ² с Π²Π°ΠΌΠΈ ΠΎΠ±ΡΡƒΠ΄ΠΈΡ‚ΡŒ ваши ΠΈΠ΄Π΅ΠΈ, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сСйчас, ΠΏΠΎΠΊΠ° я пьян ΠΈ Π½Π° вСсСлС. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ @kivaiko ΠΈ ΠΌΡ‹ созвонимся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ я Ρ‚Ρ€Π΅Π·Π²ΠΎ ΠΎΡ†Π΅Π½ΠΈΠ²Π°Π» ваши ΡˆΠ°Π½ΡΡ‹ ΠΈ Π΄Π°Π» экспСртныС Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ.

Π—Π°Π΄Π°Ρ‡Π°: 525. Contiguous Array Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium Π”Π°Π½ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ массив nums. Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠ³ΠΎ подмассива с Ρ€Π°Π²Π½Ρ‹ΠΌ количСством 0 ΠΈ 1. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: nums = [0,1]
Output: 2
Explanation: [0, 1] is the longest contiguous subarray with an equal number of 0 and 1.
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ count для отслСТивания разности ΠΌΠ΅ΠΆΠ΄Ρƒ количСством 1 ΠΈ 0, ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ max_length для хранСния максимальной Π΄Π»ΠΈΠ½Ρ‹ подмассива. Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ map для хранСния ΠΏΠ΅Ρ€Π²Ρ‹Ρ… встрСч ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ значСния count. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (0, -1) Π² Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ. 2βƒ£Π˜Ρ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ ΠΏΡ€ΠΎΠΉΠ΄ΠΈΡ‚Π΅ ΠΏΠΎ массиву nums. На ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ обновляйтС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ count (ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΠΉΡ‚Π΅ Π½Π° 1 для 1 ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°ΠΉΡ‚Π΅ Π½Π° 1 для 0). Если Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ count ΡƒΠΆΠ΅ сущСствуСт Π² Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π΅, вычислитС Π΄Π»ΠΈΠ½Ρƒ подмассива ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ индСксом ΠΈ индСксом ΠΈΠ· Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹. ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ max_length, Ссли Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ подмассив Π΄Π»ΠΈΠ½Π½Π΅Π΅. 3⃣Если Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ count Π½Π΅ сущСствуСт Π² Ρ…Π΅Ρˆ-Ρ‚Π°Π±Π»ΠΈΡ†Π΅, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π΅Π³ΠΎ с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ индСксом. ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ max_length. 😎 РСшСниС:
class Solution {
    function findMaxLength($nums) {
        $countMap = [0 => -1];
        $maxLength = 0;
        $count = 0;
        
        for ($i = 0; $i < count($nums); $i++) {
            $count += ($nums[$i] == 1 ? 1 : -1);
            
            if (array_key_exists($count, $countMap)) {
                $maxLength = max($maxLength, $i - $countMap[$count]);
            } else {
                $countMap[$count] = $i;
            }
        }
        
        return $maxLength;
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 868. Binary Gap Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: easy Π”Π°Π½ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ число n, Π½Π°ΠΉΠ΄ΠΈΡ‚Π΅ ΠΈ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ наибольшСС расстояниС ΠΌΠ΅ΠΆΠ΄Ρƒ Π»ΡŽΠ±Ρ‹ΠΌΠΈ двумя сосСдними Π΅Π΄ΠΈΠ½ΠΈΡ†Π°ΠΌΠΈ Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ прСдставлСнии числа n. Если Π½Π΅Ρ‚ Π΄Π²ΡƒΡ… сосСдних Π΅Π΄ΠΈΠ½ΠΈΡ†, Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ 0. Π”Π²Π΅ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ сосСдними, Ссли ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΡƒΠ»ΠΈ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π½ΡƒΠ»Π΅ΠΉ Π½Π΅Ρ‚). РасстояниС ΠΌΠ΅ΠΆΠ΄Ρƒ двумя Π΅Π΄ΠΈΠ½ΠΈΡ†Π°ΠΌΠΈ β€” это Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Π°Ρ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΈΡ… позициями Π² Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΌ прСдставлСнии. НапримСр, Π΄Π²Π΅ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ Π² "1001" ΠΈΠΌΠ΅ΡŽΡ‚ расстояниС 3. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: n = 22
Output: 2
Explanation: 22 in binary is "10110".
The first adjacent pair of 1's is "10110" with a distance of 2.
The second adjacent pair of 1's is "10110" with a distance of 1.
The answer is the largest of these two distances, which is 2.
Note that "10110" is not a valid pair since there is a 1 separating the two 1's underlined.
πŸ‘¨β€πŸ’» Алгоритм: 1⃣БоздайтС список A индСксов i, Ρ‚Π°ΠΊΠΈΡ… Ρ‡Ρ‚ΠΎ Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ прСдставлСнии числа n i-ΠΉ Π±ΠΈΡ‚ установлСн Π² 1. 2βƒ£Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ список A, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ максимальноС расстояниС ΠΌΠ΅ΠΆΠ΄Ρƒ сосСдними значСниями. Для этого ΠΏΡ€ΠΎΠΉΠ΄ΠΈΡ‚Π΅ ΠΏΠΎ списку ΠΈ вычислитС Ρ€Π°Π·Π½ΠΈΡ†Ρƒ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ сосСдним элСмСнтом. 3⃣ВСрнитС Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ΅ максимальноС расстояниС. 😎 РСшСниС:
class Solution {
    function binaryGap($N) {
        $A = [];
        for ($i = 0; $i < 32; $i++)
            if (($N >> $i) & 1) $A[] = $i;

        $ans = 0;
        for ($i = 0; $i < count($A) - 1; $i++)
            $ans = max($ans, $A[$i + 1] - $A[$i]);
        return $ans;
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

Π—Π°Π΄Π°Ρ‡Π°: 1038. Binary Search Tree to Greater Sum Tree Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: medium ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ² ΠΊΠΎΡ€Π΅Π½ΡŒ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π° поиска (BST), ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠΉΡ‚Π΅ Π΅Π³ΠΎ Π² большСС Π΄Π΅Ρ€Π΅Π²ΠΎ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ исходного BST Π±Ρ‹Π» Π·Π°ΠΌΠ΅Π½Π΅Π½ Π½Π° исходный ΠΊΠ»ΡŽΡ‡ плюс сумма всСх ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°ΡŽΡ‰ΠΈΡ… исходный ΠΊΠ»ΡŽΡ‡ Π² BST. Напомним, Ρ‡Ρ‚ΠΎ Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ поиска - это Π΄Π΅Ρ€Π΅Π²ΠΎ, ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‰Π΅Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ограничСниям: Π»Π΅Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ ΡƒΠ·Π»Π° содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠ·Π»Ρ‹ с ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ мСньшС, Ρ‡Π΅ΠΌ ΠΊΠ»ΡŽΡ‡ ΡƒΠ·Π»Π°. ΠŸΡ€Π°Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΠΎ ΡƒΠ·Π»Π° содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠ·Π»Ρ‹ с ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ большС, Ρ‡Π΅ΠΌ ΠΊΠ»ΡŽΡ‡ ΡƒΠ·Π»Π°. И Π»Π΅Π²ΠΎΠ΅, ΠΈ ΠΏΡ€Π°Π²ΠΎΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€Π΅Π²ΡŒΡ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΌΠΈ Π΄Π΅Ρ€Π΅Π²ΡŒΡΠΌΠΈ поиска. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:
Input: root = [4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
Output: [30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]
πŸ‘¨β€πŸ’» Алгоритм: 1βƒ£ΠžΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ ΠΎΠ±Ρ…ΠΎΠ΄ in-order: ΠŸΡ€ΠΎΠΉΠ΄ΠΈΡ‚Π΅ ΠΏΠΎ Π΄Π΅Ρ€Π΅Π²Ρƒ Π² порядкС "ΠΏΡ€Π°Π²Ρ‹ΠΉ, ΠΊΠΎΡ€Π΅Π½ΡŒ, Π»Π΅Π²Ρ‹ΠΉ" (ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ in-order ΠΎΠ±Ρ…ΠΎΠ΄). Π­Ρ‚ΠΎ обСспСчит посСщСниС ΡƒΠ·Π»ΠΎΠ² Π² порядкС убывания ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. 2⃣НакоплСниС суммы: Π’ΠΎ врСмя ΠΎΠ±Ρ…ΠΎΠ΄Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ для хранСния Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½Π½ΠΎΠΉ суммы. На ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡƒΠ·Π»Π΅ добавляйтС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠ·Π»Π° ΠΊ Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½Π½ΠΎΠΉ суммС ΠΈ обновляйтС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠ·Π»Π° этой Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½Π½ΠΎΠΉ суммой. 3βƒ£ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡƒΠ·Π»ΠΎΠ²: ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠΉΡ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° Π² Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½Π½ΡƒΡŽ сумму. 😎 РСшСниС:
class TreeNode {
    public $val = null;
    public $left = null;
    public $right = null;
    function __construct($val = 0, $left = null, $right = null) {
        $this->val = $val;
        $this->left = $left;
        $this->right = $right;
    }
}

class Solution {
    private $sum = 0;
    
    function bstToGst($root) {
        $this->reverseInorder($root);
        return $root;
    }
    
    function reverseInorder($node) {
        if ($node === null) return;
        $this->reverseInorder($node->right);
        $this->sum += $node->val;
        $node->val = $this->sum;
        $this->reverseInorder($node->left);
    }
}
Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ