PHP | LeetCode
Kanalga Telegram’da o‘tish
Cайт easyoffer.ru Реклама @easyoffer_adv ВП @easyoffer_vp Тесты t.me/+pSDoLEZBQRZlNmFi Вопросы собесов t.me/+RJaDhjYaQDo2Njcy Вакансии t.me/+J-DKRUtjUgMxZGNi
Ko'proq ko'rsatish1 374
Obunachilar
Ma'lumot yo'q24 soatlar
-87 kunlar
-930 kunlar
Ma'lumot yuklanmoqda...
O'xshash kanallar
Taglar buluti
Kirish va chiqish esdaliklari
---
---
---
---
---
---
Obunachilarni jalb qilish
Iyun '26
Iyun '26
+8
0 kanalda
May '26
+8
0 kanalda
Get PRO
Aprel '26
+1
0 kanalda
Get PRO
Mart '26
+8
0 kanalda
Get PRO
Fevral '26
+10
0 kanalda
Get PRO
Yanvar '26
+12
0 kanalda
Get PRO
Dekabr '25
+13
0 kanalda
Get PRO
Noyabr '25
+53
0 kanalda
Get PRO
Oktabr '25
+34
0 kanalda
Get PRO
Sentabr '25
+34
0 kanalda
Get PRO
Avgust '25
+42
0 kanalda
Get PRO
Iyul '25
+48
1 kanalda
Get PRO
Iyun '25
+41
0 kanalda
Get PRO
May '25
+56
0 kanalda
Get PRO
Aprel '25
+53
0 kanalda
Get PRO
Mart '25
+127
3 kanalda
Get PRO
Fevral '25
+88
1 kanalda
Get PRO
Yanvar '25
+98
53 kanalda
Get PRO
Dekabr '24
+40
0 kanalda
Get PRO
Noyabr '24
+53
1 kanalda
Get PRO
Oktabr '24
+152
12 kanalda
Get PRO
Sentabr '24
+430
331 kanalda
Get PRO
Avgust '24
+85
0 kanalda
Get PRO
Iyul '24
+382
219 kanalda
Get PRO
Iyun '24
+418
232 kanalda
| Sana | Obunachilarni jalb qilish | Esdaliklar | Kanallar | |
| 24 Iyun | 0 | |||
| 23 Iyun | 0 | |||
| 22 Iyun | 0 | |||
| 21 Iyun | 0 | |||
| 20 Iyun | 0 | |||
| 19 Iyun | 0 | |||
| 18 Iyun | 0 | |||
| 17 Iyun | +1 | |||
| 16 Iyun | 0 | |||
| 15 Iyun | +1 | |||
| 14 Iyun | 0 | |||
| 13 Iyun | 0 | |||
| 12 Iyun | 0 | |||
| 11 Iyun | 0 | |||
| 10 Iyun | +1 | |||
| 09 Iyun | 0 | |||
| 08 Iyun | +2 | |||
| 07 Iyun | 0 | |||
| 06 Iyun | 0 | |||
| 05 Iyun | 0 | |||
| 04 Iyun | +1 | |||
| 03 Iyun | +1 | |||
| 02 Iyun | 0 | |||
| 01 Iyun | +1 |
Kanal postlari
Задача: 187. Repeated DNA Sequences
Сложность: medium
ДНК состоит из серии нуклеотидов, обозначаемых как 'A', 'C', 'G' и 'T'.
Например, "ACGAATTCCG" — это последовательность ДНК.
При изучении ДНК полезно определять повторяющиеся последовательности внутри молекулы ДНК.
Дана строка s, представляющая последовательность ДНК. Верните все последовательности длиной 10 букв (подстроки), которые встречаются более одного раза в молекуле ДНК. Ответ можно возвращать в любом порядке.
Пример:
Input: s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT" Output: ["AAAAACCCCC","CCCCCAAAAA"]👨💻 Алгоритм: 1⃣Перебираем начальные позиции последовательности от 1 до 𝑁−𝐿, где 𝑁 — длина строки, а 𝐿 — длина подстроки (в данном случае 10): Если начальная позиция 𝑠𝑡𝑎𝑟𝑡==0, вычисляем хеш первой последовательности 𝑠[0:𝐿]. В противном случае вычисляем скользящий хеш из предыдущего значения хеша. 2⃣Проверяем хеш в хешсете: Если хеш уже существует в хешсете, значит, мы нашли повторяющуюся последовательность, и пора обновить вывод. В противном случае добавляем хеш в хешсет. 3⃣Возвращаем список вывода, содержащий все повторяющиеся последовательности. 😎 Решение:
class Solution {
function findRepeatedDnaSequences($s) {
$L = 10; $n = strlen($s);
if ($n <= $L) return [];
$a = 4; $aL = pow($a, $L);
$toInt = ['A' => 0, 'C' => 1, 'G' => 2, 'T' => 3];
$nums = array_map(function($c) use ($toInt) { return $toInt[$c]; }, str_split($s));
$h = 0;
$seen = []; $output = [];
for ($start = 0; $start < $n - $L + 1; ++$start) {
if ($start != 0)
$h = $h * $a - $nums[$start - 1] * $aL + $nums[$start + $L - 1];
else
for ($i = 0; $i < $L; ++$i)
$h = $h * $a + $nums[$i];
if (in_array($h, $seen))
$output[] = substr($s, $start, $L);
$seen[] = $h;
}
return array_unique($output);
}
}
Ставь 👍 и забирай 📚 Базу знаний| 2 | Задача: 1021. Remove Outermost Parentheses
Сложность: easy
Например, "", "()", "(" + A + ")" или A + B, где A и B - допустимые строки со скобками, а + означает объединение строк. Все допустимые строки со скобками - "", "()", "(())()" и "(()(())".
Допустимая строка со скобками s является примитивной, если она непустая и не существует способа разбить ее на s = A + B, причем A и B - непустые допустимые строки со скобками. Если дана допустимая строка со скобками s, рассмотрим ее примитивное разложение: s = P1 + P2 + ... + Pk, где Pi - примитивные допустимые строки со скобками. Верните s после удаления крайних скобок из каждой примитивной строки в примитивном разложении s.
Пример:
Input: s = "(()())(())"
Output: "()()()"
👨💻 Алгоритм:
1⃣Инициализация переменных:
Создайте пустую строку для хранения результата.
Используйте счетчик для отслеживания уровня вложенности скобок..
2⃣Обработка строки:
Итерируйте по каждому символу строки.
Если встречаете (, увеличивайте счетчик уровня вложенности. Если уровень вложенности больше 1, добавьте ( в результат.
Если встречаете ), уменьшайте счетчик уровня вложенности. Если уровень вложенности больше 0 перед уменьшением, добавьте ) в результат.
3⃣Возврат результата:
Верните результат, содержащий строку без крайних скобок из каждой примитивной строки.
😎 Решение:
class Solution {
function removeOuterParentheses($s) {
$result = '';
$level = 0;
for ($i = 0; $i < strlen($s); $i++) {
if ($s[$i] == '(') {
if ($level > 0) {
$result .= $s[$i];
}
$level++;
} else {
$level--;
if ($level > 0) {
$result .= $s[$i];
}
}
}
return $result;
}
}
Ставь 👍 и забирай 📚 Базу знаний | 52 |
| 3 | Осталось 3 часа до конца акции:
«Пожизненный PRO тариф — по цене 1 года»
Поиск работы отнимает силы, время и веру в себя, но не у тех кто использует easyoffer PRO. Успей сделать самую выгодную инвестицию в развитие своей карьеры.
Акция закончится уже сегодня 23 июня 23:59 по мск:
👉 https://easyoffer.ru/pro | 30 |
| 4 | Задача: 946. Validate Stack Sequences
Сложность: medium
Учитывая, что два целочисленных массива pushed и popped имеют разные значения, верните true, если это могло быть результатом последовательности операций push и pop на изначально пустом стеке, или false в противном случае.
Пример:
Input: pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
Output: true
👨💻 Алгоритм:
1⃣Инициализировать пустой стек.
Использовать указатель j для отслеживания текущей позиции в массиве popped.
2⃣Пройти по каждому элементу в массиве pushed:
Добавить элемент в стек.
Проверить верхний элемент стека:
Если он совпадает с текущим элементом в popped, удалить элемент из стека и увеличить указатель j.
3⃣В конце вернуть true, если указатель j достиг конца массива popped, иначе вернуть false.
😎 Решение:
function validateStackSequences($pushed, $popped) {
$stack = [];
$j = 0;
foreach ($pushed as $x) {
$stack[] = $x;
while (!empty($stack) && $j < count($popped) && end($stack) == $popped[$j]) {
array_pop($stack);
$j++;
}
}
return $j == count($popped);
}
Ставь 👍 и забирай 📚 Базу знаний | 67 |
| 5 | Последний день акции:
«Пожизненный PRO тариф — по цене 1 года»
🚀 PRO включает:
– Полный доступ ко всем грейдам и профессиям
– База live-coding задач и вопросов из технических собеседований с вероятностью их встречи
– Примеры лучших ответов от Senior разработчиков
– 1100+ записи реальных собеседований, в том числе в топовые компании (Сбер, Авито, Яндекс, WB, OZON, МТС и др.)
– База 400+ тестовых заданий от компаний.
– Автоотклики на вакансии в хедхантер
– Аналитика ТОП-требований из вакансий для лучшего написания резюме и прохождения ATS систем рекрутеров
– Генератор уникального резюме и CV под каждую вакансию
– Тренажеры подготовки к собеседованию: «Реальное собеседование» и «Проработка вопросов» по методике интервальных повторений (как Anki)
– (скоро) Агрегатор вакансий
– (скоро) Сообщество
Акция закончится уже сегодня 23 июня 23:59 по мск:
👉 https://easyoffer.ru/pro | 69 |
| 6 | Задача: 146. LRU Cache
Сложность: medium
Реализуйте класс LRUCache:
LRUCache(int capacity) - инициализирует LRU-кэш с положительным размером capacity.
int get(int key) - возвращает значение по ключу, если ключ существует, в противном случае возвращает -1.
void put(int key, int value) - обновляет значение по ключу, если ключ существует. В противном случае добавляет пару ключ-значение в кэш. Если количество ключей превышает установленную емкость после этой операции, удаляет наименее недавно использованный ключ.
Функции get и put должны выполняться за среднее время O(1).
Пример:
Input
["LRUCache", "put", "put", "get", "put", "get", "put", "get", "get", "get"]
[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]
Output
[null, null, null, 1, null, -1, null, -1, 3, 4]
👨💻 Алгоритм:
1⃣Метод добавления узла в конец связного списка (add):
Получите текущий узел в конце списка, это "реальный" хвост: tail.prev, обозначим его как previousEnd.
Вставьте node после previousEnd, установив previousEnd.next = node.
Настройте указатели узла: node.prev = previousEnd и node.next = tail.
Обновите tail.prev = node, делая node новым "реальным" хвостом списка.
2⃣Метод удаления узла из связного списка (remove):
Узел node должен быть удален из списка. Для этого определите узлы nextNode = node.next и prevNode = node.prev.
Чтобы удалить node, переназначьте prevNode.next = nextNode и nextNode.prev = prevNode, эффективно исключая node из списка.
Это превратит, например, последовательность A <-> B <-> C в A <-> C, где prevNode = A и nextNode = C.
3⃣Методы get и put:
get(int key): Проверьте, существует ли ключ в хэш-карте. Если нет, верните -1. Иначе, получите узел, связанный с ключом, переместите его в конец списка с помощью remove(node) и add(node). Верните node.val.
put(int key, int value): Если ключ уже существует, найдите соответствующий узел и удалите его методом remove. Создайте новый узел с key и value, добавьте его в хэш-карту и в конец списка методом add(node). Если размер кэша превышает установленную емкость после добавления, удалите самый редко используемый узел (который находится в голове списка после фиктивного узла head), затем удалите соответствующий ключ из хэш-карты.
😎 Решение:
class Node {
public $key;
public $value;
public $next;
public $prev;
public function __construct($key, $value) {
$this->key = $key;
$this->value = $value;
$this->next = null;
$this->prev = null;
}
}
class LRUCache {
private $capacity;
private $dic = [];
private $head;
private $tail;
public function __construct($capacity) {
$this->capacity = $capacity;
$this->head = new Node(-1, -1);
$this->tail = new Node(-1, -1);
$this->head->next = $this->tail;
$this->tail->prev = $this->head;
}
public function get($key) {
if (!array_key_exists($key, $this->dic)) {
return -1;
}
$node = $this->dic[$key];
$this->remove($node);
$this->add($node);
return $node->value;
}
public function put($key, $value) {
if (array_key_exists($key, $this->dic)) {
$this->remove($this->dic[$key]);
}
$node = new Node($key, $value);
$this->add($node);
$this->dic[$key] = $node;
if (count($this->dic) > $this->capacity) {
$nodeToDelete = $this->head->next;
$this->remove($nodeToDelete);
unset($this->dic[$nodeToDelete->key]);
}
}
private function add($node) {
$pre = $this->tail->prev;
$pre->next = $node;
$node->prev = $pre;
$node->next = $this->tail;
$this->tail->prev = $node;
}
private function remove($node) {
$pre = $node->prev;
$nxt = $node->next;
$pre->next = $nxt;
$nxt->prev = $pre;
}
}
Ставь 👍 и забирай 📚 Базу знаний | 57 |
| 7 | Пожизненный PRO тариф — по цене 1 года.
Покупаешь один раз — пользуешься всю жизнь:
👉 https://easyoffer.ru/pro
🚀 PRO-доступ закроет 99% проблем на пути к офферу:
1. Полный доступ ко всем грейдам и профессиям. Не важно, Junior вы или Senior, Тестировщик, Разработчик, Проджект — вы получите материалы под ваш текущий уровень и цели, без ограничений.
2. База live-coding задач и вопросов с реальных собесов с уникальной системой вероятности их встречи. Вы будете готовиться не вслепую, а точечно по тем темам, которые спрашивают чаще всего.
3. Эталонные ответы от Senior-разработчиков. Никакой воды и догадок — только четкие, структурированные решения, за которые дают «зеленый свет» к офферу
4. 1100+ записей реальных собеседований (включая топы: Сбер, Авито, Яндекс, WB, OZON, МТС). Вы увидите всё изнутри: как спрашивают, как отвечают сильные кандидаты и на каких ошибках проваливаются 80% проходящих.
5. База 400+ тестовых заданий. Если вы еще студент, то практикуйтесь на решении задач, которые помогут попасть на собес
6. Автоотклики на Хедхантере — пока вы спите, ваше резюме летит к рекрутерам автоматически. Это экономия сотен часов ручного кликанья.
7. Аналитика ТОП-требований из вакансий. Мы парсим рынок и показываем, какие скиллы сейчас в цене. Это позволит вам точечно апгрейдить резюме и проходить суровые ATS-фильтры (которые отсеивают до 75% резюме еще до просмотра рекрутером).
8. Генератор уникального резюме и CV под каждую вакансию. Забудьте про «универсальное» резюме — нейросеть адаптирует ваш опыт под конкретную позицию за минуту, повышая шансы на приглашение в разы.
9. Тренажеры подготовки к собеседованию:
«Реальное собеседование» — сценарий вопросов из реальных интервью
«Проработка вопросов» — флеш карточки с вопросами/ответами по методике интервальных повторений (как Anki)
10. (Скоро) Агрегатор вакансий — все вакансии из HH, Telegram, LinkedIn и других площадок в одной ленте.
11. (Скоро) Закрытое комьюнити — нетворкинг и помощь в сложных вопросах от таких же целеустремленных айтишников.
Завтра последний день акции:
👉 https://easyoffer.ru/pro | 58 |
| 8 | Задача: 686. Repeated String Match
Сложность: medium
Даны две строки a и b. Верните минимальное количество повторений строки a, чтобы строка b стала её подстрокой. Если сделать b подстрокой a невозможно, верните -1.
Обратите внимание: строка "abc", повторенная 0 раз, это "", повторенная 1 раз - "abc", повторенная 2 раза - "abcabc".
Пример:
Input: a = "abcd", b = "cdabcdab"
Output: 3
Explanation: We return 3 because by repeating a three times "abcdabcdabcd", b is a substring of it.
👨💻 Алгоритм:
1⃣Найти минимальное количество повторений строки A, чтобы её длина стала больше или равна длине B. Это значение q = ceil(len(B) / len(A)).
2⃣Проверить, является ли B подстрокой строки A, повторенной q раз. Если да, вернуть q. Иначе, проверить строку A, повторенную (q+1) раз. Если B является подстрокой этой строки, вернуть q+1.
3⃣Если B не является подстрокой ни в одном из случаев, вернуть -1.
😎 Решение:
class Solution {
function repeatedStringMatch($A, $B) {
$q = 1;
$S = $A;
while (strlen($S) < strlen($B)) {
$S .= $A;
$q++;
}
if (strpos($S, $B) !== false) return $q;
if (strpos($S . $A, $B) !== false) return $q + 1;
return -1;
}
}
Ставь 👍 и забирай 📚 Базу знаний | 76 |
| 9 | Задача: 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';
}
Ставь 👍 и забирай 📚 Базу знаний | 73 |
| 10 | Привет, ребята!
У нас для вас отличные новости — на easyoffer вышло сразу несколько крупных обновлений:
1. Автоотклики на HeadHunter
Снова работают в полную силу — можно смело возвращаться к активному поиску.
2. Новый раздел «Резюмейкер»
Теперь вы можете быстро создавать уникальные резюме, адаптированные под каждую вакансию, и сразу добавлять сопроводительное письмо. Это заметно повышает шансы получить приглашение на собеседование.
3. База вопросов стала чище
Мы навели порядок и удалили около 30% дубликатов.
Ориентироваться стало проще.
––––––––––––––––––
🔥 Акция в честь обновления
Пожизненный тариф easyoffer PRO — по цене одного года.
Успейте до 23 июня:
👉 https://easyoffer.ru/pro
––––––––––––––––––
Что дальше?
В ближайшие пару недель добавим ещё два раздела:
1. Сообщество с чатами по всем профессиональным направлениям.
2. Агрегатор вакансий, чтобы поиск работы стал ещё удобнее. | 62 |
| 11 | Задача: 226. Invert Binary Tree
Сложность: easy
Дан корень бинарного дерева, инвертируйте дерево и верните его корень.
Пример:
Input: root = [4,2,7,1,3,6,9]
Output: [4,7,2,9,6,3,1]
👨💻 Алгоритм:
1⃣Рекурсивная инверсия поддеревьев:
Если текущий узел (root) пустой, возвращаем null.
Рекурсивно инвертируем правое поддерево и сохраняем результат в переменную right.
Рекурсивно инвертируем левое поддерево и сохраняем результат в переменную left.
2⃣Обмен поддеревьев:
Устанавливаем левое поддерево текущего узла равным правому поддереву.
Устанавливаем правое поддерево текущего узла равным левому поддереву.
3⃣Возврат корня:
Возвращаем текущий узел (root) как новый корень инвертированного дерева.
😎 Решение:
class TreeNode {
public $val;
public $left;
public $right;
public function __construct($val = 0, $left = null, $right = null) {
$this->val = $val;
$this->left = $left;
$this->right = $right;
}
}
class Solution {
public function invertTree($root) {
if ($root === null) {
return null;
}
$right = $this->invertTree($root->right);
$left = $this->invertTree($root->left);
$root->left = $right;
$root->right = $left;
return $root;
}
}
Ставь 👍 и забирай 📚 Базу знаний | 75 |
| 12 | Задача №17. Letter Combinations of a Phone Number
Сложность: medium
Учитывая строку, содержащую цифры от 2 до 9 включительно, верните все возможные комбинации букв, которые может представлять число. Верните ответ в любом порядке. Соответствие цифр буквам (как на кнопках телефона) приведено ниже. Обратите внимание, что 1 не соответствует никаким буквам.
Пример:
Input: digits = "23"
Output: ["ad","ae","af","bd","be","bf","cd","ce","cf"]
👨💻 Алгоритм:
1⃣Создать ассоциативный массив, сопоставляющий цифры с соответствующими буквами.
2⃣Использовать рекурсию для перебора всех возможных комбинаций.
3⃣Добавлять полученные комбинации в результирующий массив.
😎 Решение:
class Solution {
public $result = [];
function letterCombinations($digits) {
if(strlen($digits) == 0) {
return [];
}
$layouts = [
2 => range('a', 'c'),
3 => range('d', 'f'),
4 => range('g', 'i'),
5 => range('j', 'l'),
6 => range('m', 'o'),
7 => range('p', 's'),
8 => range('t', 'v'),
9 => range('w', 'z'),
];
return $this->recursive(0, $digits, $layouts);
}
function recursive ($index, $chars, $layouts, $combine = '') {
foreach($layouts[$chars[$index]] as $currentLayout) {
if($layouts[$chars[$index + 1]]) {
$this->recursive($index + 1, $chars, $layouts, $combine . $currentLayout);
} else {
$this->result[] = $combine . $currentLayout;
}
}
return $this->result;
}
}
Ставь 👍 и забирай 📚 Базу знаний | 75 |
| 13 | #hard
Задача: 827. Making A Large Island
Вам дан n x n бинарный матрица grid. Вам разрешено изменить не более одного 0 на 1.
Верните размер самого большого острова в grid после выполнения этой операции.
Остров — это группа 1, соединенных в 4 направлениях.
Пример:
Input: grid = [[1,1],[1,0]]
Output: 4
Explanation: Change the 0 to 1 and make the island bigger, only one island with area = 4.
👨💻 Алгоритм:
1⃣Пройдите по матрице и пометьте каждую группу, используя уникальный индекс, и запомните её размер.
2⃣Для каждого 0 в матрице проверьте соседние группы и вычислите потенциальный размер острова, если изменить этот 0 на 1.
3⃣Возвращайте максимальный размер острова, учитывая как уже существующие острова, так и потенциальные, образованные после изменения 0 на 1.
😎 Решение:
class Solution {
private $dr = [-1, 0, 1, 0];
private $dc = [0, -1, 0, 1];
private $grid;
private $N;
function largestIsland($grid) {
$this->grid = $grid;
$this->N = count($grid);
$index = 2;
$area = array_fill(0, $this->N * $this->N + 2, 0);
for ($r = 0; $r < $this->N; ++$r) {
for ($c = 0; $c < $this->N; ++$c) {
if ($grid[$r][$c] == 1) {
$area[$index] = $this->dfs($r, $c, $index);
++$index;
}
}
}
$ans = max($area);
for ($r = 0; $r < $this->N; ++$r) {
for ($c = 0; $c < $this->N; ++$c) {
if ($grid[$r][$c] == 0) {
$seen = [];
foreach ($this->neighbors($r, $c) as $move) {
if ($grid[$move[0]][$move[1]] > 1) {
$seen[$grid[$move[0]][$move[1]]] = true;
}
}
$bns = 1;
foreach (array_keys($seen) as $i) {
$bns += $area[$i];
}
$ans = max($ans, $bns);
}
}
}
return $ans;
}
function dfs($r, $c, $index) {
$ans = 1;
$this->grid[$r][$c] = $index;
foreach ($this->neighbors($r, $c) as $move) {
if ($this->grid[$move[0]][$move[1]] == 1) {
$this->grid[$move[0]][$move[1]] = $index;
$ans += $this->dfs($move[0], $move[1], $index);
}
}
return $ans;
}
function neighbors($r, $c) {
$ans = [];
for ($k = 0; $k < 4; ++$k) {
$nr = $r + $this->dr[$k];
$nc = $c + $this->dc[$k];
if ($nr >= 0 && $nr < $this->N && $nc >= 0 && $nc < $this->N) {
$ans[] = [$nr, $nc];
}
}
return $ans;
}
Ставь 👍 и забирай 📚 Базу знаний | 64 |
| 14 | Задача: 1150. Check If a Number Is Majority Element in a Sorted Array
Сложность: easy
Дан целочисленный массив nums, отсортированный в неубывающем порядке, и целое число target. Верните true, если target является элементом большинства, или false в противном случае.
Элемент большинства в массиве nums — это элемент, который встречается в массиве более чем nums.length / 2 раз.
Пример:
Input: nums = [2,4,5,5,5,5,5,6,6], target = 5
Output: true
Explanation: The value 5 appears 5 times and the length of the array is 9.
Thus, 5 is a majority element because 5 > 9/2 is true.
👨💻 Алгоритм:
1⃣Инициализация переменной count:
Инициализируйте переменную count значением 0..
2⃣Итерация по списку nums:
Пройдите по каждому элементу списка nums.
Если элемент num равен target, увеличьте значение переменной count.
3⃣Проверка условия мажоритарного элемента:
Если count больше чем половина длины списка nums, верните true.
В противном случае верните false.
😎 Решение:
class Solution {
function isMajorityElement($nums, $target) {
$count = 0;
foreach ($nums as $num) {
if ($num == $target) {
$count++;
}
}
return $count > count($nums) / 2;
}
}
Ставь 👍 и забирай 📚 Базу знаний | 95 |
| 15 | Задача: 188. Best Time to Buy and Sell Stock IV
Сложность: hard
Дан массив целых чисел prices, где prices[i] - это цена данной акции в i-й день, и целое число k.
Найдите максимальную прибыль, которую вы можете получить. Вы можете завершить не более чем k транзакций, т.е. вы можете купить не более k раз и продать не более k раз.
Обратите внимание: Вы не можете участвовать в нескольких транзакциях одновременно (т.е., вы должны продать акцию, прежде чем снова купить).
Пример:
Input: k = 2, prices = [2,4,1]
Output: 2
Explanation: Buy on day 1 (price = 2) and sell on day 2 (price = 4), profit = 4-2 = 2.
👨💻 Алгоритм:
1⃣Инициализация DP массива: Инициализируйте трехмерный массив dp, где dp[i][j][l] представляет максимальную прибыль на конец i-го дня с j оставшимися транзакциями и l акциями в портфеле. Начните с dp[0][0][0] = 0 (нет прибыли без акций и транзакций) и dp[0][1][1] = -prices[0] (покупка первой акции).
2⃣Вычисление переходов: Для каждого дня и каждого возможного количества транзакций вычислите возможные действия: держать акцию, не держать акцию, купить акцию, если j > 0, или продать акцию. Обновляйте dp с использованием:
dp[i][j][1] = max(dp[i−1][j][1], dp[i−1][j−1][0] - prices[i]) (максимум между удержанием акции и покупкой новой).
dp[i][j][0] = max(dp[i−1][j][0], dp[i−1][j][1] + prices[i]) (максимум между неудержанием акции и продажей).
3⃣Расчет результатов: По завершении всех дней, возвращайте максимальное значение dp[n-1][j][0] для всех j от 0 до k, что представляет максимальную прибыль без удержания акций на последний день. Обработайте специальный случай, когда 𝑘×2≥𝑛, чтобы избежать лишних расчетов.
😎 Решение:
class Solution {
function maxProfit($k, $prices) {
$n = count($prices);
if ($n == 0 || $k == 0) return 0;
if ($k * 2 >= $n) {
$res = 0;
for ($i = 1; $i < $n; $i++) {
$res += max(0, $prices[$i] - $prices[$i - 1]);
}
return $res;
}
$dp = array_fill(0, $n, array_fill(0, $k + 1, [PHP_INT_MIN / 2, PHP_INT_MIN / 2]));
$dp[0][0][0] = 0;
$dp[0][1][1] = -$prices[0];
for ($i = 1; $i < $n; $i++) {
for ($j = 0; $j <= $k; $j++) {
$dp[$i][$j][0] = max($dp[$i - 1][$j][0], $dp[$i - 1][$j][1] + $prices[$i]);
if ($j > 0) {
$dp[$i][$j][1] = max($dp[$i - 1][$j][1], $dp[$i - 1][$j - 1][0] - $prices[$i]);
}
}
}
$res =
Ставь 👍 и забирай 📚 Базу знаний | 80 |
| 16 | Задача: 722. Remove Comments
Сложность: medium
Дана программа на C++, удалите из нее комментарии. Исходный текст программы представляет собой массив строк source, где source[i] - это i-я строка исходного кода. Это результат разбиения исходной строки исходного кода символом новой строки '\n'. В C++ существует два типа комментариев: строчные и блочные. Строка "//" обозначает строчный комментарий, который означает, что он и остальные символы справа от него в той же строке должны игнорироваться. Строка "/*" обозначает блочный комментарий, который означает, что все символы до следующего (не перекрывающегося) вхождения "*/" должны игнорироваться. (Здесь вхождения происходят в порядке чтения: строка за строкой слева направо.) Чтобы было понятно, строка "/*/" еще не завершает блочный комментарий, так как окончание будет перекрывать начало. Первый эффективный комментарий имеет приоритет над остальными.
Например, если строка "//" встречается в блочном комментарии, она игнорируется. Аналогично, если строка "/*" встречается в строчном или блочном комментарии, она также игнорируется. Если после удаления комментариев определенная строка кода оказывается пустой, вы не должны выводить эту строку: каждая строка в списке ответов будет непустой.
Пример:
Input: source = ["/*Test program */", "int main()", "{ ", " // variable declaration ", "int a, b, c;", "/* This is a test", " multiline ", " comment for ", " testing */", "a = b + c;", "}"]
Output: ["int main()","{ "," ","int a, b, c;","a = b + c;","}"]
👨💻 Алгоритм:
1⃣Создайте строку buffer для хранения текущей строки кода без комментариев и флаг inBlock для отслеживания, находимся ли мы внутри блочного комментария.
2⃣Пройдите по каждой строке source и по каждому символу в этой строке, обрабатывая комментарии: Если встречен блочный комментарий /*, установите флаг inBlock и пропустите символы до */. Если встречен строчный комментарий //, прекратите обработку текущей строки. Если не находимся внутри комментария, добавьте символ в buffer.
3⃣После обработки всех строк добавьте непустые строки из buffer в результат.
😎 Решение:
function removeComments($source) {
$inBlock = false;
$buffer = "";
$result = [];
foreach ($source as $line) {
$i = 0;
if (!$inBlock) $buffer = "";
while ($i < strlen($line)) {
if (!$inBlock && $i + 1 < strlen($line) && $line[$i] == '/' && $line[$i + 1] == '*') {
$inBlock = true;
$i++;
} elseif ($inBlock && $i + 1 < strlen($line) && $line[$i] == '*' && $line[$i + 1] == '/') {
$inBlock = false;
$i++;
} elseif (!$inBlock && $i + 1 < strlen($line) && $line[$i] == '/' && $line[$i + 1] == '/') {
break;
} elseif (!$inBlock) {
$buffer .= $line[$i];
}
$i++;
}
if (!$inBlock && strlen($buffer) > 0) {
$result[] = $buffer;
}
}
return $result;
}
Ставь 👍 и забирай 📚 Базу знаний | 79 |
| 17 | Задача: 667. Beautiful Arrangement II
Сложность: medium
Даны два целых числа n и k, составьте список answer, содержащий n различных положительных чисел в диапазоне от 1 до n, который соответствует следующему требованию:
Предположим, что этот список answer = [a1, a2, a3, ... , an], тогда список [|a1 - a2|, |a2 - a3|, |a3 - a4|, ... , |an-1 - an|] имеет ровно k различных чисел. Верните список answer. Если существует несколько допустимых ответов, верните любой из них.
Пример:
Input: n = 3, k = 1
Output: [1,2,3]
Explanation: The [1,2,3] has three different positive integers ranging from 1 to 3, and the [1,1] has exactly 1 distinct integer: 1
👨💻 Алгоритм:
1⃣Инициализация списка:
Начните с создания списка от 1 до n: [1, 2, 3, ..., n].
2⃣Конструирование шаблона с k различиями:
Для обеспечения k различных значений разностей используйте следующий подход:
Включайте числа попеременно с конца и начала списка, начиная с n и 1, чтобы создать как можно больше уникальных разностей.
Если требуется меньше k, оставшиеся числа просто добавляйте в порядке возрастания, чтобы не увеличивать количество уникальных разностей.
3⃣Заполнение списка:
Заполните оставшуюся часть списка последовательными числами, чтобы сохранить уникальные числа в диапазоне от 1 до n.
😎 Решение:
class Solution {
function constructArray($n, $k) {
$answer = [];
$left = 1;
$right = $n;
for ($i = 0; $i <= $k; $i++) {
if ($i % 2 == 0) {
$answer[] = $left++;
} else {
$answer[] = $right--;
}
}
if ($k % 2 == 0) {
for ($i = $right; $i >= $left; $i--) {
$answer[] = $i;
}
} else {
for ($i = $left; $i <= $right; $i++) {
$answer[] = $i;
}
}
return $answer;
}
}
Ставь 👍 и забирай 📚 Базу знаний | 68 |
| 18 | Задача: 904. Fruit Into Baskets
Сложность: medium
Вы посещаете ферму, где в один ряд слева направо расположены фруктовые деревья. Деревья представлены целочисленным массивом fruits, где fruits[i] - это тип фрукта, который производит i-е дерево. Вы хотите собрать как можно больше фруктов. Однако у владельца есть строгие правила, которым вы должны следовать: у вас есть только две корзины, и каждая корзина может содержать только один тип фруктов. Количество фруктов в каждой корзине не ограничено. Начиная с любого дерева по вашему выбору, вы должны собрать ровно один фрукт с каждого дерева (включая начальное), двигаясь при этом вправо. Собранные фрукты должны поместиться в одну из ваших корзин. Как только вы достигнете дерева с фруктами, которые не могут поместиться в ваши корзины, вы должны остановиться. Учитывая целочисленный массив fruits, верните максимальное количество фруктов, которое вы можете собрать.
Пример:
Input: fruits = [1,2,1]
Output: 3
👨💻 Алгоритм:
1⃣Использовать метод скользящего окна для поддержания текущего подмассива, содержащего не более двух типов фруктов.
2⃣Перемещать правый указатель, расширяя окно, и обновлять количество каждого типа фрукта в окне.
Если количество типов фруктов в окне превышает два, перемещать левый указатель, уменьшая окно, пока в окне снова не будет не более двух типов фруктов.
3⃣Подсчитывать максимальное количество фруктов, собранных на каждом шаге.
😎 Решение:
function totalFruit($fruits) {
$basket = [];
$left = 0;
$maxFruits = 0;
for ($right = 0; $right < count($fruits); $right++) {
if (!isset($basket[$fruits[$right]])) {
$basket[$fruits[$right]] = 0;
}
$basket[$fruits[$right]]++;
while (count($basket) > 2) {
$basket[$fruits[$left]]--;
if ($basket[$fruits[$left]] == 0) {
unset($basket[$fruits[$left]]);
}
$left++;
}
$maxFruits = max($maxFruits, $right - $left + 1);
}
return $maxFruits;
}
Ставь 👍 и забирай 📚 Базу знаний | 88 |
| 19 | Задача: 43. Multiply Strings
Сложность: hard
Даны две строки num1 и num2, представляющие неотрицательные целые числа. Необходимо вернуть их произведение в виде строки.
Запрещено использовать встроенные библиотеки для работы с большими числами (BigInteger) и напрямую преобразовывать строки в числа.
Пример:
Input: num1 = "2", num2 = "3"
Output: "6"
👨💻 Алгоритм:
1⃣Перевернуть строки num1 и num2.
2⃣Умножить каждую цифру num2[j] на каждую цифру num1[i], добавляя результаты в массив ans.
3⃣ Обработать переносы (carry), чтобы числа не превышали 9.
😎 Решение:
function multiply($num1, $num2) {
if ($num1 === "0" || $num2 === "0") {
return "0";
}
$n = strlen($num1);
$m = strlen($num2);
$ans = array_fill(0, $n + $m, 0);
for ($i = $n - 1; $i >= 0; $i--) {
for ($j = $m - 1; $j >= 0; $j--) {
$mul = ($num1[$i] - '0') * ($num2[$j] - '0');
$sum = $mul + $ans[$i + $j + 1];
$ans[$i + $j + 1] = $sum % 10;
$ans[$i + $j] += intdiv($sum, 10);
}
}
while (count($ans) > 1 && $ans[0] === 0) {
array_shift($ans);
}
return implode("", $ans);
}
Ставь 👍 и забирай 📚 Базу знаний | 104 |
| 20 | Задача: 1463. Cherry Pickup II
Сложность: hard
Дана матрица grid размером rows x cols, представляющая поле с вишнями, где grid[i][j] обозначает количество вишен, которые можно собрать с клетки (i, j).
У вас есть два робота, которые могут собирать вишни:
Робот №1 находится в левом верхнем углу (0, 0), а
Робот №2 находится в правом верхнем углу (0, cols - 1).
Верните максимальное количество собранных вишен с помощью обоих роботов, следуя приведённым ниже правилам:
Из клетки (i, j) роботы могут перемещаться в клетку (i + 1, j - 1), (i + 1, j) или (i + 1, j + 1).
Когда любой робот проходит через клетку, он подбирает все вишни, и клетка становится пустой.
Когда оба робота находятся в одной клетке, только один из них собирает вишни.
Оба робота не могут выходить за пределы матрицы в любой момент времени.
Оба робота должны достичь нижней строки в матрице grid.
Пример:
Input: grid = [[1,0,0,0,0,0,1],[2,0,0,0,0,3,0],[2,0,9,0,0,0,0],[0,3,0,5,4,0,0],[1,0,2,3,0,0,6]]
Output: 28
Explanation: Path of robot #1 and #2 are described in color green and blue respectively.
Cherries taken by Robot #1, (1 + 9 + 5 + 2) = 17.
Cherries taken by Robot #2, (1 + 3 + 4 + 3) = 11.
Total of cherries: 17 + 11 = 28.
👨💻 Алгоритм:
1⃣Определите трехмерный массив dp, где dp[row][col1][col2] представляет максимальное количество вишен, которые можно собрать, если робот 1 находится в (row, col1), а робот 2 находится в (row, col2).
2⃣Итеративно заполните dp, начиная с нижней строки, вычисляя для каждой клетки максимальное количество вишен, которое можно собрать с учетом возможных перемещений роботов.
3⃣Верните dp[0][0][n-1], что представляет максимальное количество вишен, которое можно собрать, начиная с верхнего левого и верхнего правого углов.
😎 Решение:
class Solution {
function cherryPickup($grid) {
$m = count($grid);
$n = count($grid[0]);
$dp = array_fill(0, $m, array_fill(0, $n, array_fill(0, $n, 0)));
for ($row = $m - 1; $row >= 0; $row--) {
for ($col1 = 0; $col1 < $n; $col1++) {
for ($col2 = 0; $col2 < $n; $col2++) {
$result = $grid[$row][$col1];
if ($col1 != $col2) {
$result += $grid[$row][$col2];
}
if ($row != $m - 1) {
$maxCherries = 0;
for ($newCol1 = $col1 - 1; $newCol1 <= $col1 + 1; $newCol1++) {
for ($newCol2 = $col2 - 1; $newCol2 <= $col2 + 1; $newCol2++) {
if ($newCol1 >= 0 && $newCol1 < $n && $newCol2 >= 0 && $newCol2 < $n) {
$maxCherries = max($maxCherries, $dp[$row + 1][$newCol1][$newCol2]);
}
}
}
$result += $maxCherries;
}
$dp[$row][$col1][$col2] = $result;
}
}
}
return $dp[0][0][$n - 1];
}
}
Ставь 👍 и забирай 📚 Базу знаний | 96 |
Endi mavjud! Telegram Tadqiqoti 2025 — yilning asosiy insaytlari 
