Java | LeetCode
Open in Telegram
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv
Show more6 506
Subscribers
-424 hours
-217 days
-5730 days
Posts Archive
6 507
#medium
Задача: 417. Pacific Atlantic Water Flow
Имеется прямоугольный остров размером m x n, который граничит с Тихим и Атлантическим океанами. Тихий океан касается левого и верхнего краев острова, а Атлантический океан - правого и нижнего краев. Остров разбит на сетку квадратных ячеек. Вам дана целочисленная матрица heights размером m x n, где heights[r][c] - высота над уровнем моря клетки с координатами (r, c). На острове выпадает много осадков, и дождевая вода может стекать в соседние клетки прямо на север, юг, восток и запад, если высота соседней клетки меньше или равна высоте текущей клетки. Вода может течь из любой клетки, прилегающей к океану, в океан. Верните двумерный список координат сетки result, где result[i] = [ri, ci] означает, что дождевая вода может течь из клетки (ri, ci) как в Тихий, так и в Атлантический океаны.
Пример:
Input: heights = [[1,2,2,3,5],[3,2,3,4,4],[2,4,5,3,1],[6,7,1,4,5],[5,1,1,2,4]] Output: [[0,4],[1,3],[1,4],[2,2],[3,0],[3,1],[4,0]]👨💻 Алгоритм: 1⃣Определите две матрицы для отслеживания клеток, из которых вода может течь в Тихий и Атлантический океаны, используя поиск в глубину (DFS) или поиск в ширину (BFS), начиная с границ, примыкающих к каждому океану. 2⃣Выполните поиск для каждого океана, обновляя матрицы достижимости. 3⃣Соберите координаты клеток, которые могут стекать в оба океана, проверяя пересечение двух матриц достижимости. 😎 Решение:
import java.util.ArrayList;
import java.util.List;
public class Solution {
public List<List<Integer>> pacificAtlantic(int[][] heights) {
int m = heights.length;
int n = heights[0].length;
boolean[][] pacific = new boolean[m][n];
boolean[][] atlantic = new boolean[m][n];
int[][] directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
for (int i = 0; i < m; i++) {
dfs(i, 0, pacific, heights, directions);
dfs(i, n - 1, atlantic, heights, directions);
}
for (int j = 0; j < n; j++) {
dfs(0, j, pacific, heights, directions);
dfs(m - 1, j, atlantic, heights, directions);
}
List<List<Integer>> result = new ArrayList<>();
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (pacific[i][j] && atlantic[i][j]) {
List<Integer> cell = new ArrayList<>();
cell.add(i);
cell.add(j);
result.add(cell);
}
}
}
return result;
}
private void dfs(int r, int c, boolean[][] ocean, int[][] heights, int[][] directions) {
ocean[r][c] = true;
for (int[] dir : directions) {
int nr = r + dir[0], nc = c + dir[1];
if (nr >= 0 && nc >= 0 && nr < heights.length && nc < heights[0].length && !ocean[nr][nc] && heights[nr][nc] >= heights[r][c]) {
dfs(nr, nc, ocean, heights, directions);
}
}
}
}
Ставь 👍 и забирай 📚 Базу знаний6 507
#medium
Задача: 416. Partition Equal Subset Sum
Если задан целочисленный массив nums, верните третье максимальное число в этом массиве. Если третьего максимального числа не существует, верните максимальное число.
Пример:
Input: nums = [1,5,11,5] Output: true👨💻 Алгоритм: 1⃣Проверьте, является ли сумма всех элементов массива четной. Если нет, верните false. 2⃣Используйте динамическое программирование для определения, можно ли найти подмножество с суммой, равной половине от общей суммы элементов. 3⃣Инициализируйте массив для хранения возможных сумм и обновляйте его, проверяя каждое число в массиве. 😎 Решение:
public class Solution {
public boolean canPartition(int[] nums) {
int sum = 0;
for (int num : nums) sum += num;
if (sum % 2 != 0) return false;
int target = sum / 2;
boolean[] dp = new boolean[target + 1];
dp[0] = true;
for (int num : nums) {
for (int j = target; j >= num; j--) {
dp[j] = dp[j] || dp[j - num];
}
}
return dp[target];
}
}
Ставь 👍 и забирай 📚 Базу знаний6 507
#easy
Задача: 415. Add Strings
Если задан целочисленный массив nums, верните третье максимальное число в этом массиве. Если третьего максимального числа не существует, верните максимальное число.
Пример:
Input: num1 = "11", num2 = "123" Output: "134"👨💻 Алгоритм: 1⃣Инициализируйте три переменные для хранения первого, второго и третьего максимальных чисел. 2⃣Пройдите по массиву nums, обновляя переменные первого, второго и третьего максимальных чисел, избегая дубликатов. 3⃣Верните третье максимальное число, если оно существует, иначе верните первое максимальное число. 😎 Решение:
import java.util.HashSet;
import java.util.Set;
public class Solution {
public int thirdMax(int[] nums) {
Integer first = null;
Integer second = null;
Integer third = null;
for (Integer num : nums) {
if (num.equals(first) || num.equals(second) || num.equals(third)) {
continue;
}
if (first == null || num > first) {
third = second;
second = first;
first = num;
} else if (second == null || num > second) {
third = second;
second = num;
} else if (third == null || num > third) {
third = num;
}
}
return third != null ? third : first;
}
}
Ставь 👍 и забирай 📚 Базу знаний6 507
#easy
Задача: 414. Third Maximum Number
Если задан целочисленный массив nums, верните третье максимальное число в этом массиве. Если третьего максимального числа не существует, верните максимальное число.
Пример:
Input: nums = [3,2,1] Output: 1👨💻 Алгоритм: 1⃣Инициализируйте три переменные для хранения первого, второго и третьего максимальных чисел, используя значения None или аналогичные значения. 2⃣Пройдитесь по массиву, обновляя переменные первого, второго и третьего максимальных чисел, избегая дубликатов. 3⃣Если третье максимальное число существует, верните его. В противном случае, верните первое максимальное число. 😎 Решение:
import java.util.HashSet;
import java.util.Set;
public class Solution {
public int thirdMax(int[] nums) {
Integer first = null;
Integer second = null;
Integer third = null;
for (Integer num : nums) {
if (num.equals(first) || num.equals(second) || num.equals(third)) {
continue;
}
if (first == null || num > first) {
third = second;
second = first;
first = num;
} else if (second == null || num > second) {
third = second;
second = num;
} else if (third == null || num > third) {
third = num;
}
}
return third != null ? third : first;
}
}
Ставь 👍 и забирай 📚 Базу знаний6 507
#medium
Задача: 413. Arithmetic Slices
Целочисленный массив называется арифметическим, если он состоит не менее чем из трех элементов и если разность между любыми двумя последовательными элементами одинакова. Например, [1,3,5,7,9], [7,7,7] и [3,-1,-5,-9] являются арифметическими последовательностями. Если задан целочисленный массив nums, верните количество арифметических подмассивов массива nums. Подмассив - это непрерывная подпоследовательность массива.
Пример:
Input: nums = [1,2,3,4] Output: 3👨💻 Алгоритм: 1⃣Пройдите по массиву, инициализируя два указателя: начальный и текущий. Начните с первой пары элементов. 2⃣Для каждой пары элементов проверяйте, сохраняется ли разность между последовательными элементами. Если да, увеличивайте длину текущей арифметической последовательности. Если нет, сбрасывайте начальную позицию и начинайте новую последовательность. 3⃣Суммируйте количество найденных арифметических подмассивов, учитывая, что для каждого арифметического подмассива длины len, количество таких подмассивов равно (len - 2). 😎 Решение:
public class Solution {
public int numberOfArithmeticSlices(int[] nums) {
if (nums.length < 3) return 0;
int count = 0;
int currentLength = 0;
for (int i = 2; i < nums.length; i++) {
if (nums[i] - nums[i - 1] == nums[i - 1] - nums[i - 2]) {
currentLength++;
count += currentLength;
} else {
currentLength = 0;
}
}
return count;
}
}
Ставь 👍 и забирай 📚 Базу знаний6 507
#easy
Задача: 412. Fizz Buzz
Учитывая целое число n, верните строковый массив answer (с индексом 1), где: answer[i] == "FizzBuzz", если i делится на 3 и 5. answer[i] == "Fizz", если i делится на 3. answer[i] == "Buzz", если i делится на 5. answer[i] == i (как строка), если ни одно из перечисленных условий не верно.
Пример:
Input: nums = [1,2,2] Output: [[],[1],[1,2],[1,2,2],[2],[2,2]]👨💻 Алгоритм: 1⃣Создайте пустой список для хранения результата. 2⃣Пройдите по всем числам от 1 до n и для каждого числа выполните проверку: Если число делится на 3 и на 5, добавьте "FizzBuzz". Если число делится на 3, добавьте "Fizz". Если число делится на 5, добавьте "Buzz". Если ни одно из условий не выполнено, добавьте само число как строку. 3⃣Верните полученный список. 😎 Решение:
import java.util.ArrayList;
import java.util.List;
public class Solution {
public List<String> fizzBuzz(int n) {
List<String> answer = new ArrayList<>();
for (int i = 1; i <= n; i++) {
if (i % 3 == 0 && i % 5 == 0) {
answer.add("FizzBuzz");
} else if (i % 3 == 0) {
answer.add("Fizz");
} else if (i % 5 == 0) {
answer.add("Buzz");
} else {
answer.add(String.valueOf(i));
}
}
return answer;
}
}
Ставь 👍 и забирай 📚 Базу знаний6 507
#hard
Задача: 411. Minimum Unique Word Abbreviation
Строку можно сократить, заменив любое количество не смежных подстрок их длинами. Например, строка "substitution" может быть сокращена как (но не ограничиваясь этим):
"s10n" ("s ubstitutio n") "sub4u4" ("sub stit u tion") "12" ("substitution") "su3i1u2on" ("su bst i t u ti on") "substitution" (без замен подстрок) Обратите внимание, что "s55n" ("s ubsti tutio n") не является правильным сокращением "substitution", поскольку замененные подстроки являются смежными.
Длина аббревиатуры - это количество букв, которые не были заменены, плюс количество подстрок, которые были заменены. Например, аббревиатура "s10n" имеет длину 3 (2 буквы + 1 подстрока), а "su3i1u2on" - 9 (6 букв + 3 подстроки). Учитывая целевую строку target и массив строк dictionary, верните аббревиатуру target с наименьшей возможной длиной, которая не является аббревиатурой ни одной строки в словаре. Если существует несколько самых коротких аббревиатур, верните любую из них.
Пример:
Input: target = "apple", dictionary = ["blade"]
Output: "a4"
👨💻 Алгоритм:
1⃣Создайте множество всех аббревиатур из словаря, вычислив их все возможные аббревиатуры.
2⃣Сгенерируйте все возможные аббревиатуры для строки target.
3⃣Найдите самую короткую аббревиатуру для target, которая отсутствует в множестве аббревиатур словаря.
😎 Решение:
import java.util.HashSet;
import java.util.Set;
public class Solution {
public String minAbbreviation(String target, String[] dictionary) {
Set<String> targetAbbrs = generateAbbreviations(target);
Set<String> dictAbbrs = new HashSet<>();
for (String word : dictionary) {
dictAbbrs.addAll(generateAbbreviations(word));
}
targetAbbrs.removeAll(dictAbbrs);
return targetAbbrs.stream().min((a, b) -> Integer.compare(a.length(), b.length())).orElse("");
}
private Set<String> generateAbbreviations(String word) {
Set<String> result = new HashSet<>();
generateAbbreviationsHelper(word.toCharArray(), "", 0, 0, result);
return result;
}
private void generateAbbreviationsHelper(char[] word, String current, int pos, int count, Set<String> result) {
if (pos == word.length) {
result.add(current + (count > 0 ? count : ""));
return;
}
generateAbbreviationsHelper(word, current, pos + 1, count + 1, result);
generateAbbreviationsHelper(word, current + (count > 0 ? count : "") + word[pos], pos + 1, 0, result);
}
}
Ставь 👍 и забирай 📚 Базу знаний6 507
#easy
Задача: 410. Split Array Largest Sum
Учитывая целочисленный массив nums и целое число k, разбейте nums на k непустых подмассивов так, чтобы наибольшая сумма любого подмассива была минимальна. Верните минимизированную наибольшую сумму разбиения. Подмассив - это смежная часть массива.
Пример:
Input: nums = [7,2,5,10,8], k = 2 Output: 18👨💻 Алгоритм: 1⃣Определите границы для бинарного поиска: минимальная сумма равна максимальному элементу массива, максимальная сумма равна сумме всех элементов массива. 2⃣Выполните бинарный поиск по этим границам. Для каждой средней суммы проверьте, можно ли разбить массив на k подмассивов, чтобы максимальная сумма подмассива не превышала эту среднюю сумму. 3⃣Если возможно разбить массив для данной средней суммы, уменьшите верхнюю границу. Если нет, увеличьте нижнюю границу. Повторяйте до тех пор, пока границы не сойдутся. 😎 Решение:
public class Solution {
public int splitArray(int[] nums, int k) {
int left = 0, right = 0;
for (int num : nums) {
left = Math.max(left, num);
right += num;
}
while (left < right) {
int mid = left + (right - left) / 2;
if (canSplit(nums, k, mid)) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
private boolean canSplit(int[] nums, int k, int maxSum) {
int currentSum = 0, subarrays = 1;
for (int num : nums) {
if (currentSum + num > maxSum) {
currentSum = num;
subarrays++;
if (subarrays > k) {
return false;
}
} else {
currentSum += num;
}
}
return true;
}
}
Ставь 👍 и забирай 📚 Базу знаний6 507
Блиц-тестирование на грейд в Java
Менторы ШОРТКАТ собрали полезный небольшой тест, который поможет тебе проверить знания.
Конечно, это не определит грейд точно, но даст понять, какие темы западают. За прохождение ещё и дадут скидку на менторство.
Переходи в бот, чтобы пройти тест: @shortcut_sh_bot
Реклама. ООО "ШОРТКАТ", ИНН: 9731139396, erid: 2VtzqxT9r3j
6 507
#easy
Задача: 409. Longest Palindrome
Если задана строка s, состоящая из строчных или прописных букв, верните длину самого длинного палиндрома, который можно построить из этих букв. Буквы чувствительны к регистру, например, "Aa" не считается палиндромом.
Пример:
Input: s = "abccccdd" Output: 7👨💻 Алгоритм: 1⃣Создайте словарь для подсчета количества каждого символа в строке. 2⃣Пройдитесь по словарю и добавьте четное количество каждого символа к длине палиндрома. Если встречается нечетное количество символа, добавьте (count - 1) к длине палиндрома. 3⃣Если есть хотя бы один символ с нечетным количеством, добавьте 1 к длине палиндрома для центрального символа. 😎 Решение:
import java.util.HashMap;
import java.util.Map;
public class Solution {
public int longestPalindrome(String s) {
Map<Character, Integer> charCount = new HashMap<>();
for (char c : s.toCharArray()) {
charCount.put(c, charCount.getOrDefault(c, 0) + 1);
}
int length = 0;
boolean oddFound = false;
for (int count : charCount.values()) {
if (count % 2 == 0) {
length += count;
} else {
length += count - 1;
oddFound = true;
}
}
return oddFound ? length + 1 : length;
}
}
Ставь 👍 и забирай 📚 Базу знаний6 507
#easy
Задача: 408. Valid Word Abbreviation
Строку можно сократить, заменив любое количество не смежных, непустых подстрок их длинами. Длины не должны содержать ведущих нулей.
Например, строка "замена" может быть сокращена следующим образом (но не ограничивается этим): "s10n" ("s ubstitutio n") "sub4u4" ("sub stit u tion") "12" ("замена") "su3i1u2on" ("su bst i t u ti on") "substitution" (без замены подстрок) Следующие сокращения не являются допустимыми:
"s55n" ("s ubsti tutio n", заменяемые подстроки смежные) "s010n" (содержит ведущие нули) "s0ubstitution" (заменяет пустую подстроку) Если задано строковое слово и аббревиатура abbr, верните, соответствует ли строка заданной аббревиатуре.
Подстрока - это непрерывная непустая последовательность символов в строке.
Пример:
Input: word = "internationalization", abbr = "i12iz4n" Output: true👨💻 Алгоритм: 1⃣Инициализируйте два указателя: один для строки word и один для аббревиатуры abbr. Начните сравнение символов строки и аббревиатуры с начала. 2⃣Если символ аббревиатуры - это цифра, вычислите полное число и переместите указатель строки word на это количество символов. Если символ аббревиатуры - это буква, убедитесь, что он совпадает с текущим символом строки. 3⃣Повторяйте шаг 2, пока оба указателя не достигнут конца строки и аббревиатуры соответственно. Если это так, верните true, иначе false. 😎 Решение:
public class Solution {
public boolean validWordAbbreviation(String word, String abbr) {
int i = 0, j = 0;
while (i < word.length() && j < abbr.length()) {
if (Character.isDigit(abbr.charAt(j))) {
if (abbr.charAt(j) == '0') {
return false;
}
int num = 0;
while (j < abbr.length() && Character.isDigit(abbr.charAt(j))) {
num = num * 10 + abbr.charAt(j) - '0';
j++;
}
i += num;
} else {
if (word.charAt(i) != abbr.charAt(j)) {
return false;
}
i++;
j++;
}
}
return i == word.length() && j == abbr.length();
}
}
Ставь 👍 и забирай 📚 Базу знаний6 507
Бесплатный интенсив: Java-разработчик: старт в профессии с нуля.
📆 Когда: 21-22 декабря в 14:00 по мск.
За два дня интенсива в прямом эфире, под руководством опытного Java-разработчика, вы сможете:
✔️ Познакомиться с синтаксисом и основными конструкциями языка Java.
✔️ Написать свой первый проект и определить, подходит ли вам профессия разработчика.
✔️ Создать консольное приложение на Java с интеграцией API Яндекс.Карт для построения маршрутов и поиска информации.
✔️ Узнать ответы на интересующие вас вопросы.
✔️ Получить доступ к закрытому профессиональному сообществу.
🎁 Подарки для участниковинтенсива: гайд «Как заговорить на сленге IT-специалистов», карта компетенций начинающего Java-разработчика и доступ в закрытое сообщество «Старт в Java» от Хекслета!
6 507
#Medium
Задача: 486. Predict the Winner
Дан целочисленный массив nums. Два игрока играют в игру с этим массивом: игрок 1 и игрок 2.
Игрок 1 и игрок 2 ходят по очереди, начиная с игрока 1. Оба игрока начинают игру с нулевым счетом. В каждый ход игрок берет одно из чисел с любого конца массива (то есть nums[0] или nums[nums.length - 1]), что уменьшает размер массива на 1. Игрок добавляет выбранное число к своему счету. Игра заканчивается, когда в массиве не останется элементов.
Верните true, если игрок 1 может выиграть игру. Если счета обоих игроков равны, игрок 1 все равно считается победителем, и вы также должны вернуть true. Вы можете считать, что оба игрока играют оптимально.
Пример:
Input: nums = [1,5,2] Output: false Explanation: Initially, player 1 can choose between 1 and 2. If he chooses 2 (or 1), then player 2 can choose from 1 (or 2) and 5. If player 2 chooses 5, then player 1 will be left with 1 (or 2). So, final score of player 1 is 1 + 2 = 3, and player 2 is 5. Hence, player 1 will never be the winner and you need to return👨💻 Алгоритм: 1⃣Определите maxDiff(left, right) как максимальную разницу в счете, которую текущий игрок может достичь. Если left = right, верните nums[left]. 2⃣В противном случае текущий игрок может выбрать nums[left] или nums[right]. Максимальная разница в счете, которую он может получить, равна большему из значений nums[left] - maxDiff(left + 1, right) и nums[right] - maxDiff(left, right - 1). 3⃣Верните true, если maxDiff(0, n - 1) >= 0. Этот вызов сделан с точки зрения первого игрока, и первый игрок является победителем, если у игроков одинаковый счет (разница 0). 😎 Решение:
class Solution {
private int maxDiff(int[] nums, int left, int right) {
if (left == right) {
return nums[left];
}
int scoreByLeft = nums[left] - maxDiff(nums, left + 1, right);
int scoreByRight = nums[right] - maxDiff(nums, left, right - 1);
return Math.max(scoreByLeft, scoreByRight);
}
public boolean predictTheWinner(int[] nums) {
int n = nums.length;
return maxDiff(nums, 0, n - 1) >= 0;
}
}
Ставь 👍 и забирай 📚 Базу знаний6 507
#Easy
Задача: 485. Max Consecutive Ones
Дан бинарный массив nums, верните максимальное количество последовательных единиц в массиве.
Пример:
Input: nums = [1,1,0,1,1,1] Output: 3 Explanation: The first two digits or the last three digits are consecutive 1s. The maximum number of consecutive 1s is 3.👨💻 Алгоритм: 1⃣Поддерживайте счетчик для подсчета единиц и увеличивайте его на 1 при встрече единицы. 2⃣Когда встречаете ноль, используйте текущий счетчик единиц для нахождения максимального количества последовательных единиц на данный момент, затем сбросьте счетчик единиц на 0. 3⃣В конце верните максимальное значение. 😎 Решение:
class Solution {
public int findMaxConsecutiveOnes(int[] nums) {
int count = 0;
int maxCount = 0;
for (int num : nums) {
if (num == 1) {
count += 1;
} else {
maxCount = Math.max(maxCount, count);
count = 0;
}
}
return Math.max(maxCount, count);
}
}
Ставь 👍 и забирай 📚 Базу знаний6 507
👍Научитесь писать проверки для своего проекта, правильно подсвечивать в IDE и репортить найденные инциденты!
На бесплатном уроке онлайн-курса «Android Developer. Professional» — «Android Lint»: регистрация
Что будет на вебинаре?
- Подробно рассмотрим API Android Lint и PSI/UAST деревья
- Научимся реализовывать свои Detector'ы
- Научимся тестировать реализованные Detector'ы
Каким слушателям вебинар будет полезен?
- Инженерам, которые интересуются статическим анализом, хотят автоматизировать поиск codesmell'ов, проверку кодстайла, проверку принятых в проекте регламентов.
🔥После вебинара вы сможете продолжить обучение на курсе по спеццене, в том числе, в рассрочку.
erid: LjN8JxFQ7
6 507
Онлайн-курс «Java-разработчик» от EdMe с акцентом на трудоустройство и оплатой обучения после выхода на работу
Если вы хотите начать карьеру или улучшить свои навыки для выхода на новый уровень, этот курс поможет вам достичь цели.
Обучение строится на менторстве и ориентировано на подготовку к трудоустройству. За 6–8 месяцев вы освоите навыки, достаточные для уровня middle-разработчика. Потребуется выделять на обучение от 20 часов в неделю, чтобы уже к концу курса быть готовым пройти собеседование и получить оффер.
Ваш ментор – опытный разработчик, который будет помогать вам на каждом этапе: объяснять сложные темы, давать советы, как быстрее освоить материалы, и готовить вас к собеседованиям. Это не просто обучение, а четкий план достижения реальной работы.
🚩Плюсы курса:
➕Гарантированное трудоустройство с зарплатой от 140 000 рублей.
➕Оплата после выхода на работу: вы платите только 20% от зарплаты в течение 18 месяцев.
➕Карьерная поддержка даже после окончания курса.
➕Если по каким-то причинам вы не сможете завершить обучение, это можно сделать без оплаты.
Во время обучения вы будете использовать Jira, Confluence, Bitbucket, GitLab – те самые системы, которые станут вашими рабочими инструментами в IT-компаниях.
🚩Программа курса:
▪️Основы Java: Java Core, List, JDBC, Hibernate, Spring (Core, MVC, Security), Spring Boot, Git
▪️Проект
▪️Подготовка к собеседованиям (составление резюме, прохождение тестовых собеседований)
▪️Прохождение реальных собеседований
Узнать подробности и записаться на курс «Java-разработчик» можно на EdMe.pro
Отбор включает тестовое задание, которое под силу выполнить человеку без опыта, и собеседование.
Реклама. ООО "БАКСЭТ", ИНН 4345115602. Erid 2Vtzquu79TF
6 507
– Помощь с pet-проектом
– Составление roadmap
– Общая консультация
– Проведение код-ревью и mock-собеседования
– Помощь с трудоустройством
Все это и многое другое может Ментор. Он обеспечит вам необходимый boost, ускорит и упростит вход в IT.
🔥 Здесь размещен список менторов, и многие из них предлагают бесплатную первую консультацию
6 507
#Medium
Задача: 484. Find Permutation
Перестановка perm из n целых чисел всех чисел в диапазоне [1, n] может быть представлена в виде строки s длиной n - 1, где:
s[i] == 'I', если perm[i] < perm[i + 1], и
s[i] == 'D', если perm[i] > perm[i + 1].
Дана строка s, восстановите лексикографически наименьшую перестановку perm и верните её.
Пример:
Input: s = "I" Output: [1,2] Explanation: [1,2] is the only legal permutation that can represented by s, where the number 1 and 2 construct an increasing relationship.👨💻 Алгоритм: 1⃣Инициализация Создайте пустой стек stack. Создайте пустой список result для хранения конечной перестановки. 2⃣Для каждого числа i Если текущий символ в строке s равен 'D', добавьте i в стек. Если текущий символ в строке s равен 'I', добавьте i в стек, затем извлеките все элементы из стека и добавьте их в result. 3⃣Завершение Добавьте n в стек и извлеките все элементы из стека, добавив их в result. Верните список result, который представляет лексикографически наименьшую перестановку. 😎 Решение:
public class Solution {
public int[] findPermutation(String s) {
int[] res = new int[s.length() + 1];
Stack<Integer> stack = new Stack<>();
int j = 0;
for (int i = 1; i <= s.length(); i++) {
if (s.charAt(i - 1) == 'I') {
stack.push(i);
while (!stack.isEmpty()) {
res[j++] = stack.pop();
}
} else {
stack.push(i);
}
}
stack.push(s.length() + 1);
while (!stack.isEmpty()) {
res[j++] = stack.pop();
}
return res;
}
}
Ставь 👍 и забирай 📚 Базу знаний6 507
#medium
Задача: 764. Largest Plus Sign
Вам дано целое число n. У вас есть бинарная сетка размером n x n, в которой все значения изначально равны 1, за исключением некоторых индексов, указанных в массиве mines. Элемент массива mines с индексом i определяется как mines[i] = [xi, yi], где grid[xi][yi] == 0.
Верните порядок самого большого крестообразного знака из 1, выровненного по осям, который содержится в сетке. Если такого знака нет, верните 0.
Крестообразный знак из 1 порядка k имеет некоторый центр grid[r][c] == 1, а также четыре луча длиной k - 1, идущих вверх, вниз, влево и вправо, состоящие из 1. Обратите внимание, что за пределами лучей креста могут быть 0 или 1, проверяется только соответствующая область крестообразного знака на наличие 1.
Пример:
Input: n = 5, mines = [[4,2]]
Output: 2
Explanation: In the above grid, the largest plus sign can only be of order 2. One of them is shown.
👨💻 Алгоритм:
1⃣Создайте сетку размером n x n, заполненную единицами. Затем используйте массив mines, чтобы установить значения нулей в соответствующих ячейках сетки.
2⃣Для каждой ячейки в сетке создайте четыре дополнительных сетки: left, right, up и down, которые будут хранить длину непрерывных единиц, простирающихся в соответствующем направлении от каждой ячейки.
3⃣Пройдите по всей сетке и для каждой ячейки определите минимальную длину луча среди четырех направлений. Эта минимальная длина будет определять порядок крестообразного знака с центром в данной ячейке. Обновите максимальный порядок крестообразного знака и верните его после завершения обхода всей сетки. Если такого знака нет, верните 0.
😎 Решение:
class Solution {
public int orderOfLargestPlusSign(int N, int[][] mines) {
Set<Integer> banned = new HashSet<>();
for (int[] mine : mines)
banned.add(mine[0] * N + mine[1]);
int ans = 0;
for (int r = 0; r < N; ++r) {
for (int c = 0; c < N; ++c) {
int k = 0;
while (k <= r && r < N - k && k <= c && c < N - k &&
!banned.contains((r - k) * N + c) &&
!banned.contains((r + k) * N + c) &&
!banned.contains(r * N + c - k) &&
!banned.contains(r * N + c + k)) {
k++;
}
ans = Math.max(ans, k);
}
}
return ans;
}
}
Ставь 👍 и забирай 📚 Базу знаний