¿Qué es la búsqueda binaria?
En términos generales, la búsqueda binaria consiste en encontrar el rango de respuestas en una matriz ordenada y tomar el valor medio del rango cada vez. Si este valor es grande, tome la primera mitad y continúe reduciendo el rango; si el valor es pequeño, tome la segunda mitad para reducir el rango.
Después de cada tiempo, el rango de 1/2 se puede reducir y la respuesta se obtendrá gradualmente.
Límite de error de muestra
Pregunta de ejemplo: https://www.acwing.com/problem/content/description/1229/
Obviamente, esta pregunta se puede dividir en dos puntos. Si la enumeración es de 1 a 100000,
establezca l = 1, r = 1e5, mid = (l + r) / 2; En el
pasado, siempre usaba l = mid + 1 si mid era pequeño; r = mid-1 si mid era grande, pero cuando la respuesta a esta pregunta es 5, la respuesta será incorrecta . ¿Por qué?
Como se muestra en la figura, el primero de cada línea es l, el segundo es r y el tercero es medio.
Si la respuesta a esta pregunta es 5, cuando mid = 4, l = mid + 1, es decir, l = 5, luego salga del ciclo, La respuesta final es 4.
Perímetro
(1) mid=(l+r)/2
De hecho, es (l + r) / 2 redondeado hacia abajo. Cuando l = mid, r = mid + 1, si l + 1 sale del bucle directamente y no se ha tomado el valor de r = mid + 1.
Debido a que se redondea hacia abajo, es decir l <= mid < r
, mid es siempre menor que el valor de r, y se puede cambiar a r = mid cuando mid es grande, es decir
while(l<r){
int mid = (l+r)/2;
判断成立语句;
if(满足条件){
ans=mid;
l=mid+1;
}
else{
r=mid;
}
}
(2) También se puede redondear, es decir mid=(l+r+1)/2
. De la misma manera, l < mid <= r
mid nunca será igual a 1. En este momento, se puede cambiar a mid. Si es menor, l = mid y el código está disponible.
while(l<r){
int mid = (l+r+1)/2;
判断成立语句;
if(满足条件){
ans=mid;
l=mid;
}
else{
r=mid-1;
}
}