Skip to content

Commit ad2c516

Browse files
author
2025
committed
Update
1 parent 26b5c18 commit ad2c516

75 files changed

Lines changed: 2588 additions & 32 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 75 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,43 @@
33
Задачи распределены по особенностям самих задач и их решений<br>
44
Многие задачи могут находится одновременно в разных категориях<br>
55
Ко многим задачам добавлены комментарии и пояснения для лучшего понимания<br>
6-
Для работы используется Java 8
6+
Для работы используется Java 8<br>
7+
Желаю вам удачно пройти алгоритмическую секцию!<br><br>
78

89

9-
Жми ★ если понравилось.<br>
10+
Жми ★ если понравилось.<br><br>
1011

11-
Моя статистика: https://leetcode.com/u/YarTsin/ <br><br>
12+
Моя статистика: https://leetcode.com/u/YarTsin/ <br>
13+
Ссылка на проект - https://github.com/YarTsin/leetcode_java <br>
14+
Ссылка на GitHub Pages - <br><br>
1215

1316
<b>Array</b> <br>
1417
В этом разделе чаще всего находятся находятся задачи, использующие массивы <br>
15-
[1. Two Sum](src/main/java/org/example/g0001_0100/s0001_two_sum)
16-
[14. Longest Common Prefix](src/main/java/org/example/g0001_0100/s0014_longest_common_prefix)
17-
[66. Plus One](src/main/java/org/example/g0001_0100/s0066_plus_one)
18-
[88. Merge Sorted Array](src/main/java/org/example/g0001_0100/s0088_merge_sorted_array)
19-
<br>
18+
Примечания: мажоритарный элемент - элемент, который встречается более n/2 раз.<br>
19+
[1. Two Sum](src/main/java/org/example/g0001_0100/s0001_two_sum) &nbsp;&nbsp;
20+
[14. Longest Common Prefix](src/main/java/org/example/g0001_0100/s0014_longest_common_prefix) &nbsp;&nbsp;
21+
[66. Plus One](src/main/java/org/example/g0001_0100/s0066_plus_one) &nbsp;&nbsp;
22+
[88. Merge Sorted Array](src/main/java/org/example/g0001_0100/s0088_merge_sorted_array) &nbsp;&nbsp;
23+
[169. Majority Element](src/main/java/org/example/g0101_0200/s0169_majority_element) &nbsp;&nbsp;
24+
[217. Contains Duplicate](src/main/java/org/example/g0201_0300/s0217_contains_duplicate) &nbsp;&nbsp;
25+
[219. Contains Duplicate II](src/main/java/org/example/g0201_0300/s0219_contains_duplicate_ii) &nbsp;&nbsp;
26+
[268. Missing Number](src/main/java/org/example/g0201_0300/s0268_missing_number) &nbsp;&nbsp;
27+
[2900. Longest Unequal Adjacent Groups Subsequence I](src/main/java/org/example/g2801_2900/p2900_longest_unequal_adjacent_groups_subsequence_i) &nbsp;&nbsp;
28+
<br><br>
2029

2130
<b>Binary search</b> <br>
2231
Здесь помещаем задачи с бинарным поиском<br>
23-
[35. Search Insert Position](src/main/java/org/example/g0001_0100/s0035_search_insert_position)
24-
[108. Convert Sorted Array To Binary Search Tree](src/main/java/org/example/g0101_0200/s0108_convert_sorted_array_to_binary_search_tree)
32+
[35. Search Insert Position](src/main/java/org/example/g0001_0100/s0035_search_insert_position) &nbsp;&nbsp;
33+
[69. Sqrtx](src/main/java/org/example/g0001_0100/s0069_sqrtx) &nbsp;&nbsp;
34+
[108. Convert Sorted Array To Binary Search Tree](src/main/java/org/example/g0101_0200/s0108_convert_sorted_array_to_binary_search_tree) &nbsp;&nbsp;
35+
<br><br>
36+
37+
38+
<b>Bits</b> <br>
39+
Операции с битами <br>
40+
[268. Missing Number](src/main/java/org/example/g0201_0300/s0268_missing_number) &nbsp;&nbsp;
41+
[338. Counting Bits](src/main/java/org/example/g0301_0400/s0338_counting_bits) &nbsp;&nbsp;
42+
<br><br>
2543

2644
<b>Dynamic Programming</b> <br>
2745
Динамическое программирование (DP) — это метод решения задач,
@@ -34,42 +52,67 @@
3452
В Java обычно делают так: создают массив или таблицу для хранения результатов подзадач,
3553
заполняют этот массив постепенно, начиная с самых простых случаев,
3654
используют сохранённые результаты для решения более сложных задач.<br>
37-
55+
(как я понимаю, это часто похоже на работу с указателями) <br>
56+
[70. Climbing Stairs](src/main/java/org/example/g0001_0100/s0070_climbing_stairs) &nbsp;&nbsp;
57+
[746. Min Cost Climbing Stairs](src/main/java/org/example/g0701_0800/s0746_min_cost_climbing_stairs) &nbsp;&nbsp;
58+
[509. Fibonacci Number](src/main/java/org/example/g0501_0600/s0509_fibonacci_number) &nbsp;&nbsp;
59+
[1137. N th Tribonacci Number](src/main/java/org/example/g1101_1200/s1137_n_th_tribonacci_number) &nbsp;&nbsp;
60+
<br><br>
3861

3962
<b>Hash Table</b><br>
4063
В этом разделе находятся задачи, использующие для решения хеш таблицы,<br>
4164
например HashMap<br>
42-
[1. Two Sum](src/main/java/org/example/g0001_0100/s0001_two_sum)
43-
44-
<b>Math - математические структуры</b><br>
45-
[118. Pascals Triangle](src/main/java/org/example/g0101_0200/s0118_pascals_triangle)
46-
[119. Pascals Triangle II](src/main/java/org/example/g0101_0200/s0119_pascals_triangle_ii)
47-
65+
[1. Two Sum](src/main/java/org/example/g0001_0100/s0001_two_sum) &nbsp;&nbsp;
66+
[290. Word Pattern](src/main/java/org/example/g0201_0300/s0290_word_pattern) &nbsp;&nbsp;
67+
<br><br>
68+
69+
<b>Linked List</b><br>
70+
Задачи, связанные со связанными списками<br>
71+
Примечания: алгоритм "Черепахи и Зайца" - Floyd's Cycle-Finding Algorithm<br>
72+
[141. Linked List Cycle](src/main/java/org/example/g0101_0200/s0141_linked_list_cycle) &nbsp;&nbsp;
73+
[160. Intersection Of Two Linked Lists](src/main/java/org/example/g0101_0200/s0160_intersection_of_two_linked_lists) &nbsp;&nbsp;
74+
<br><br>
75+
76+
<b>Math</b><br>
77+
Математические структуры и задачи<br>
78+
Примечения: Палиндром - это число (или строка), которое читается одинаково в обоих направлениях.<br>
79+
[9. Palindrome number](src/main/java/org/example/g0001_0100/s0009_palindrome_number) &nbsp;&nbsp;
80+
[69. Sqrtx](src/main/java/org/example/g0001_0100/s0069_sqrtx) &nbsp;&nbsp;
81+
[118. Pascals Triangle](src/main/java/org/example/g0101_0200/s0118_pascals_triangle) &nbsp;&nbsp;
82+
[119. Pascals Triangle II](src/main/java/org/example/g0101_0200/s0119_pascals_triangle_ii) &nbsp;&nbsp;
83+
[202. Happy Number](src/main/java/org/example/g0201_0300/s0202_happy_number) &nbsp;&nbsp;
84+
[1025. Divisor game](src/main/java/org/example/g1001_1100/s1025_divisor_game) &nbsp;&nbsp;
85+
<br><br>
4886

4987

5088
<b>Pointers - Указатели</b><br>
51-
Здесь указываем задачи, которые используют указатели для решения задач<br>
52-
[26. Remove Duplicates From Sorted Array](src/main/java/org/example/g0001_0100/s0026_remove_duplicates_from_sorted_array)
53-
[27. Remove Element](src/main/java/org/example/g0001_0100/s0027_remove_element)
54-
89+
Здесь показываем задачи, которые используют указатели для решения задач<br>
90+
[26. Remove Duplicates From Sorted Array](src/main/java/org/example/g0001_0100/s0026_remove_duplicates_from_sorted_array) &nbsp;&nbsp;
91+
[27. Remove Element](src/main/java/org/example/g0001_0100/s0027_remove_element) &nbsp;&nbsp;
92+
[141. Linked List Cycle](src/main/java/org/example/g0101_0200/s0141_linked_list_cycle) &nbsp;&nbsp;
93+
[392. Is Subsequence](src/main/java/org/example/g0301_0400/s0392_is_subsequence) &nbsp;&nbsp;
94+
<br><br>
5595

5696
<b>Recursion - Рекурсия</b><br>
5797
Сюда помещаем примеры задач, использующих рекурсию
58-
[108. Convert Sorted Array To Binary Search Tree](src/main/java/org/example/g0101_0200/s0108_convert_sorted_array_to_binary_search_tree)
59-
98+
[108. Convert Sorted Array To Binary Search Tree](src/main/java/org/example/g0101_0200/s0108_convert_sorted_array_to_binary_search_tree) &nbsp;&nbsp;
99+
[509. Fibonacci Number](src/main/java/org/example/g0501_0600/s0509_fibonacci_number) &nbsp;&nbsp;
100+
[1137. N th Tribonacci Number](src/main/java/org/example/g1101_1200/s1137_n_th_tribonacci_number) &nbsp;&nbsp;
101+
<br><br>
60102

61103
<b>String</b><br>
62104
В этом разделе находятся задачи, использующие строки<br>
63-
[14. Longest Common Prefix](src/main/java/org/example/g0001_0100/s0014_longest_common_prefix)
105+
Примечания: Подпоследовательность (subsequence) - это последовательность символов,
106+
которая появляется в том же порядке, но не обязательно подряд.<br>
107+
[14. Longest Common Prefix](src/main/java/org/example/g0001_0100/s0014_longest_common_prefix) &nbsp;&nbsp;
108+
[290. Word Pattern](src/main/java/org/example/g0201_0300/s0290_word_pattern) &nbsp;&nbsp;
109+
[392. Is Subsequence](src/main/java/org/example/g0301_0400/s0392_is_subsequence) &nbsp;&nbsp;
110+
[1668. Maximum Repeating Substring](src/main/java/org/example/g1601_1700/s1668_maximum_repeating_substring) &nbsp;&nbsp;
111+
[2900. Longest Unequal Adjacent Groups Subsequence I](src/main/java/org/example/g2801_2900/p2900_longest_unequal_adjacent_groups_subsequence_i) &nbsp;&nbsp;
112+
<br><br>
64113

65114
<b>Tree</b><br>
66115
Здесь помещаем задачи, которые используют деревья для решения,<br>
67116
например TreeNode.<br>
68-
[108. Convert Sorted Array To Binary Search Tree](src/main/java/org/example/g0101_0200/s0108_convert_sorted_array_to_binary_search_tree)
69-
70-
71-
72-
73-
<b>Dynamic Programming</b> <br>
74-
Раздел на leetcode https://leetcode.com/problem-list/dynamic-programming/<br>
75-
Раздел в проекте - [src/main/java/org/example/dynamic_programming](src/main/java/org/example/dynamic_programming)<br><br>
117+
[108. Convert Sorted Array To Binary Search Tree](src/main/java/org/example/g0101_0200/s0108_convert_sorted_array_to_binary_search_tree) &nbsp;&nbsp;
118+
<br><br>
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package org.example.g0001_0100.s0009_palindrome_number;
2+
3+
/**
4+
* Является ли целое число палиндромом.
5+
* Палиндром - это число (или строка), которое читается одинаково в обоих направлениях.
6+
*
7+
* Примеры:
8+
* 121 → true
9+
* -121 → false (из-за минуса)
10+
* 10 → false
11+
*/
12+
class Solution {
13+
/**
14+
* Проверяет, является ли число палиндромом
15+
* @param x число для проверки
16+
* @return true, если число является палиндромом, иначе false
17+
*/
18+
public boolean isPalindrome(int x) {
19+
// Отрицательные числа не могут быть палиндромами
20+
// Также числа, оканчивающиеся на 0 (кроме 0) не могут быть палиндромами
21+
if (x < 0 || (x % 10 == 0 && x != 0)) {
22+
return false;
23+
}
24+
25+
int reversedHalf = 0;
26+
27+
// Переворачиваем половину числа
28+
while (x > reversedHalf) {
29+
int lastDigit = x % 10; // Получаем последнюю цифру
30+
reversedHalf = reversedHalf * 10 + lastDigit; // Добавляем цифру к перевернутой половине
31+
x /= 10; // Удаляем последнюю цифру из исходного числа
32+
}
33+
34+
// Для чисел с четным количеством цифр x == reversedHalf
35+
// Для нечетного количества цифр x == reversedHalf / 10 (средняя цифра не важна)
36+
return x == reversedHalf || x == reversedHalf / 10;
37+
}
38+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
9\. Palindrome Number
2+
3+
Easy
4+
5+
Given an integer `x`, return `true` if `x` is palindrome integer.
6+
An integer is a **palindrome** when it reads the same backward as forward.
7+
For example, `121` is palindrome while `123` is not.
8+
9+
**Example 1:**
10+
**Input:** x = 121
11+
**Output:** true
12+
13+
**Example 2:**
14+
**Input:** x = -121
15+
**Output:** false
16+
17+
**Explanation:** From left to right, it reads -121. From right to left, it becomes 121-. Therefore it is not a palindrome.
18+
19+
**Example 3:**
20+
**Input:** x = 10
21+
**Output:** false
22+
**Explanation:** Reads 01 from right to left. Therefore it is not a palindrome.
23+
24+
**Example 4:**
25+
**Input:** x = -101
26+
**Output:** false
27+
28+
**Constraints:**
29+
* <code>-2<sup>31</sup> <= x <= 2<sup>31</sup> - 1</code>
30+
**Follow up:** Could you solve it without converting the integer to a string?
31+
32+
To solve the Palindrome Number problem in Java using a `Solution` class, we'll follow these steps:
33+
34+
1. Define a `Solution` class with a method named `isPalindrome`.
35+
2. Handle special cases where `x` is negative or divisible by 10 but not equal to zero, as they cannot be palindromes.
36+
3. Initialize variables to keep track of the reversed number (`reversed`) and the original number (`original`).
37+
4. Iterate through the digits of the original number `x`:
38+
- Extract the least significant digit using the modulo operator and append it to the reversed number.
39+
- Update `original` by removing the least significant digit using integer division.
40+
5. Check if the reversed number is equal to the original number. If so, return `true`; otherwise, return `false`.
41+
42+
Here's the implementation:
43+
44+
```java
45+
public class Solution {
46+
47+
public boolean isPalindrome(int x) {
48+
// Special cases:
49+
// As discussed, negative numbers are not palindromes.
50+
// Also, if the last digit of the number is 0, it can't be a palindrome unless the number is 0 itself.
51+
if (x < 0 || (x % 10 == 0 && x != 0)) {
52+
return false;
53+
}
54+
55+
int reversed = 0;
56+
int original = x;
57+
58+
while (original > reversed) {
59+
int digit = original % 10;
60+
reversed = reversed * 10 + digit;
61+
original /= 10;
62+
}
63+
64+
// When the length is an odd number, we can get rid of the middle digit by reversed / 10
65+
// For example when the input is 12321, at the end of the while loop we get x = 12, reversed = 123,
66+
// since the middle digit doesn't matter in palidrome(it will always equal to itself), we can simply get rid of it.
67+
return original == reversed || original == reversed / 10;
68+
}
69+
70+
public static void main(String[] args) {
71+
Solution solution = new Solution();
72+
73+
// Test cases
74+
int x1 = 121;
75+
System.out.println("Example 1 Output: " + solution.isPalindrome(x1));
76+
77+
int x2 = -121;
78+
System.out.println("Example 2 Output: " + solution.isPalindrome(x2));
79+
80+
int x3 = 10;
81+
System.out.println("Example 3 Output: " + solution.isPalindrome(x3));
82+
83+
int x4 = -101;
84+
System.out.println("Example 4 Output: " + solution.isPalindrome(x4));
85+
}
86+
}
87+
```
88+
89+
This implementation provides a solution to the Palindrome Number problem in Java.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
Подходы к решению
2+
1. Преобразование в строку (простой, но не оптимальный)
3+
Самый простой способ - преобразовать число в строку и
4+
сравнить ее с перевернутой версией. Однако это требует
5+
дополнительной памяти для строки.
6+
7+
2. Математический подход (оптимальный)
8+
Более эффективное решение - перевернуть половину числа
9+
и сравнить с оставшейся половиной. Это работает без преобразования
10+
в строку и использует O(1) дополнительной памяти.
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package org.example.g0001_0100.s0069_sqrtx;
2+
3+
/**
4+
* LeetCode Easy
5+
* Необходимо вычислить целочисленный квадратный корень из
6+
* неотрицательного числа
7+
*
8+
* Примеры
9+
* 4 → 2
10+
* 8 → 2 (так как 2.828... округляется вниз до 2)
11+
* 0 → 0
12+
*
13+
* Эффективное решение - бинарный поиск
14+
*/
15+
class Solution {
16+
/**
17+
* Вычисляет целочисленный квадратный корень из x
18+
* @param x неотрицательное целое число
19+
* @return квадратный корень, округленный вниз
20+
*/
21+
public int mySqrt(int x) {
22+
// Обработка крайних случаев
23+
if (x < 2) {
24+
return x;
25+
}
26+
27+
// Устанавливаем границы бинарного поиска
28+
int left = 1;
29+
int right = x / 2; // Квадратный корень не может быть больше x/2 при x > 1
30+
31+
while (left <= right) {
32+
int mid = left + (right - left) / 2; // Предотвращаем переполнение
33+
long square = (long) mid * mid; // Используем long для больших чисел
34+
35+
if (square == x) {
36+
return mid; // Нашли точный квадратный корень
37+
} else if (square < x) {
38+
left = mid + 1; // Ищем в правой половине
39+
} else {
40+
right = mid - 1; // Ищем в левой половине
41+
}
42+
}
43+
44+
// Возвращаем right, так как left превысил right
45+
return right;
46+
}
47+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
69\. Sqrt(x)
2+
3+
Easy
4+
Given a non-negative integer `x`, compute and return _the square root of_ `x`.
5+
Since the return type is an integer, the decimal digits are **truncated**, and only **the integer part** of the result is returned.
6+
7+
**Note:** You are not allowed to use any built-in exponent function or operator, such as `pow(x, 0.5)` or `x ** 0.5`.
8+
9+
**Example 1:**
10+
**Input:** x = 4
11+
**Output:** 2
12+
13+
**Example 2:**
14+
**Input:** x = 8
15+
**Output:** 2
16+
17+
**Explanation:** The square root of 8 is 2.82842..., and since the decimal part is truncated, 2 is returned.
18+
19+
**Constraints:**
20+
* <code>0 <= x <= 2<sup>31</sup> - 1</code>
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
Подходы к решению
2+
1. Линейный поиск (простой, но неэффективный)
3+
Перебираем числа от 0 до x, пока квадрат числа не превысит x. Сложность O(n).
4+
5+
2. Бинарный поиск (оптимальный)
6+
Используем бинарный поиск для нахождения корня, что дает сложность O(log n).
7+
8+
===========

0 commit comments

Comments
 (0)