1. Encontre o valor alvo de maneira ordenada:
O problema de "encontrar o valor alvo em um array segmentado" pode ser transformado no conhecido problema de "encontrar o valor alvo em um array ordenado" segmentando o array!
Fonte de ideias: Pergunta do botão Forçar: 1095. Encontre o valor alvo na matriz da montanha .
De acordo com o pico, a matriz da montanha é dividida em duas seções, "matriz ascendente" e "matriz descendente", e a pesquisa binária é realizada respectivamente.
2. Método de atualização intermediária:
int mid = (left + right) / 2;
Essa forma de escrever é adequada na maioria dos casos.Mas na cena em que esquerda e direita são particularmente grandes, esquerda + direita irão transbordar e obter um número negativo, O valor de mid também é negativo. A redação melhorada é:
int mid = left + (right - left) / 2;
3, a atualização das condições de contorno: evitar loop infinito
quando left
e right
a diferença for 1 ou 0, se if else
aparecer a instrução dentro left = mid
, haverá um loop infinito. Porque mid
sempre é igual left
.
if (check(mid)) {
// 下一轮搜索区间是 [mid + 1, right]
left = mid;
} else {
right = mid-1;
}
Deve ser modificado para arredondar:
int mid = left + (right - left + 1) / 2;
if (check(mid)) {
left = mid;
} else {
right = mid - 1;
}
Referência: introdução detalhada da dicotomia
Resumindo:
1, complexidade de tempo do algoritmo de busca binária de O (LGN);
2, se if else
ocorrer dentro da instrução left = mid
, modificada no meio para ser arredondada int mid = left + (right - left + 1) / 2;
.