This commit is contained in:
krahets
2026-08-18 03:09:22 +08:00
parent d8c34d88b5
commit ba5285949b
108 changed files with 237 additions and 229 deletions
@@ -486,7 +486,7 @@ comments: true
### 2.   Преобразование в поиск элемента
Мы знаем, что если массив не содержит `target` , то в конце поиска указатели $i$ и $j$ будут указывать соответственно на первый элемент, больший `target` , и на первый элемент, меньший `target` .
Мы знаем, что если массив не содержит `target` , то в конце поиска указатели $i$ и $j$ будут указывать соответственно на первый элемент, больший `target` , и на самый правый элемент, меньший `target` .
Следовательно, как показано на рисунке 10-8, для поиска левой и правой границы можно сконструировать элемент, которого нет в массиве.
@@ -26,7 +26,7 @@ comments: true
Рассмотрим процесс двоичного поиска подробнее: когда `nums[m] < target` , указатель $i$ сдвигается вправо и тем самым приближается к элементу, который больше либо равен `target` . Аналогично указатель $j$ постепенно приближается к элементу, который меньше либо равен `target` .
Следовательно, после завершения двоичного поиска обязательно выполняется следующее: указатель $i$ указывает на первый элемент, больший `target` , а указатель $j$ указывает на первый элемент, меньший `target` . **Нетрудно сделать вывод, что если массив не содержит `target` , то индекс вставки равен $i$** . Код приведен ниже:
Следовательно, после завершения двоичного поиска обязательно выполняется следующее: указатель $i$ указывает на первый элемент, больший `target` , а указатель $j$ указывает на самый правый элемент, меньший `target` . **Нетрудно сделать вывод, что если массив не содержит `target` , то индекс вставки равен $i$** . Код приведен ниже:
=== "Python"
@@ -344,7 +344,7 @@ comments: true
- Когда `nums[m] < target` или `nums[m] > target` , это означает, что `target` еще не найден, поэтому используется стандартная операция сужения интервала в двоичном поиске, **благодаря чему указатели $i$ и $j$ приближаются к `target`**.
- Когда `nums[m] == target` , это означает, что элементы меньше `target` находятся в интервале $[i, m - 1]$ , поэтому мы используем $j = m - 1$ для сужения интервала, **тем самым приближая указатель $j$ к элементам, меньшим `target`**.
После завершения цикла указатель $i$ будет указывать на самый левый `target` , а указатель $j$ - на первый элемент, меньший `target` , **поэтому индекс $i$ и является точкой вставки**.
После завершения цикла указатель $i$ будет указывать на самый левый `target` , а указатель $j$ - на самый правый элемент, меньший `target` , **поэтому индекс $i$ и является точкой вставки**.
=== "<1>"
![Шаги поиска точки вставки для повторяющихся элементов](binary_search_insertion.assets/binary_search_insertion_step1.png){ class="animation-figure" }
@@ -389,7 +389,7 @@ comments: true
elif nums[m] > target:
j = m - 1 # target находится в интервале [i, m-1]
else:
j = m - 1 # Первый элемент меньше target находится в интервале [i, m-1]
j = m - 1 # Самый правый элемент, меньший target, находится в интервале [i, m-1]
# Вернуть точку вставки i
return i
```
@@ -407,7 +407,7 @@ comments: true
} else if (nums[m] > target) {
j = m - 1; // target находится в интервале [i, m-1]
} else {
j = m - 1; // Первый элемент меньше target находится в интервале [i, m-1]
j = m - 1; // Самый правый элемент, меньший target, находится в интервале [i, m-1]
}
}
// Вернуть точку вставки i
@@ -428,7 +428,7 @@ comments: true
} else if (nums[m] > target) {
j = m - 1; // target находится в интервале [i, m-1]
} else {
j = m - 1; // Первый элемент меньше target находится в интервале [i, m-1]
j = m - 1; // Самый правый элемент, меньший target, находится в интервале [i, m-1]
}
}
// Вернуть точку вставки i
@@ -449,7 +449,7 @@ comments: true
} else if (nums[m] > target) {
j = m - 1; // target находится в интервале [i, m-1]
} else {
j = m - 1; // Первый элемент меньше target находится в интервале [i, m-1]
j = m - 1; // Самый правый элемент, меньший target, находится в интервале [i, m-1]
}
}
// Вернуть точку вставки i
@@ -474,7 +474,7 @@ comments: true
// target находится в интервале [i, m-1]
j = m - 1
} else {
// Первый элемент меньше target находится в интервале [i, m-1]
// Самый правый элемент, меньший target, находится в интервале [i, m-1]
j = m - 1
}
}
@@ -498,7 +498,7 @@ comments: true
} else if nums[m] > target {
j = m - 1 // target находится в интервале [i, m-1]
} else {
j = m - 1 // Первый элемент меньше target находится в интервале [i, m-1]
j = m - 1 // Самый правый элемент, меньший target, находится в интервале [i, m-1]
}
}
// Вернуть точку вставки i
@@ -520,7 +520,7 @@ comments: true
} else if (nums[m] > target) {
j = m - 1; // target находится в интервале [i, m-1]
} else {
j = m - 1; // Первый элемент меньше target находится в интервале [i, m-1]
j = m - 1; // Самый правый элемент, меньший target, находится в интервале [i, m-1]
}
}
// Вернуть точку вставки i
@@ -542,7 +542,7 @@ comments: true
} else if (nums[m] > target) {
j = m - 1; // target находится в интервале [i, m-1]
} else {
j = m - 1; // Первый элемент меньше target находится в интервале [i, m-1]
j = m - 1; // Самый правый элемент, меньший target, находится в интервале [i, m-1]
}
}
// Вернуть точку вставки i
@@ -563,7 +563,7 @@ comments: true
} else if (nums[m] > target) {
j = m - 1; // target находится в интервале [i, m-1]
} else {
j = m - 1; // Первый элемент меньше target находится в интервале [i, m-1]
j = m - 1; // Самый правый элемент, меньший target, находится в интервале [i, m-1]
}
}
// Вернуть точку вставки i
@@ -584,7 +584,7 @@ comments: true
} else if nums[m as usize] > target {
j = m - 1; // target находится в интервале [i, m-1]
} else {
j = m - 1; // Первый элемент меньше target находится в интервале [i, m-1]
j = m - 1; // Самый правый элемент, меньший target, находится в интервале [i, m-1]
}
}
// Вернуть точку вставки i
@@ -605,7 +605,7 @@ comments: true
} else if (nums[m] > target) {
j = m - 1; // target находится в интервале [i, m-1]
} else {
j = m - 1; // Первый элемент меньше target находится в интервале [i, m-1]
j = m - 1; // Самый правый элемент, меньший target, находится в интервале [i, m-1]
}
}
// Вернуть точку вставки i
@@ -627,7 +627,7 @@ comments: true
} else if (nums[m] > target) {
j = m - 1 // target находится в интервале [i, m-1]
} else {
j = m - 1 // Первый элемент меньше target находится в интервале [i, m-1]
j = m - 1 // Самый правый элемент, меньший target, находится в интервале [i, m-1]
}
}
// Вернуть точку вставки i
@@ -652,7 +652,7 @@ comments: true
elsif nums[m] > target
j = m - 1 # target находится в интервале [i, m-1]
else
j = m - 1 # Первый элемент меньше target находится в интервале [i, m-1]
j = m - 1 # Самый правый элемент, меньший target, находится в интервале [i, m-1]
end
end