Encuentre el valor mínimo del número de rotaciones en lenguaje C pregunta diaria

Hola, hoy compartimos un tema, que es un tema en Niuke.com

Encuentre el valor mínimo en la matriz de rotación https://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba?tpId=13&tqId=23269&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

Entonces echemos un vistazo primero al significado del título. Primero, debemos entender
inserte la descripción de la imagen aquí
de qué se trata el título. Esto, pero no malinterprete que está fuera de orden, y que fuera de orden son números aleatorios.
Hay dos soluciones a esta pregunta. Una es que comparamos el pasado uno por uno de adelante hacia atrás, primero definimos min = el primer elemento y luego asignamos el valor a min si es menor que él. sabes esto, entonces hoy hablaremos sobre eso, déjame escribirte con la idea de la búsqueda binaria

La búsqueda binaria es una matriz ordenada. Cuando queremos encontrar la posición de un número, tomamos el número del medio para comparar. Por ejemplo, si hay una matriz ascendente, tomamos el número del medio y lo comparamos con el valor que queremos. Si es mayor que el número del medio, significa que este número está detrás del número del medio, luego tomamos el número después del número del medio al número del medio del último número y los comparamos.Después de encontrar el número de esta manera , podemos encontrar rápidamente su posición

Entonces podemos usar esta idea para analizar este problema.

  1. El medio es mayor que el derecho [3, 4, 5, 1, 2], en este caso, el número más pequeño debe estar a la derecha, entonces izquierda = medio + 1
  2. El medio es igual a [1, 0, 1, 1, 1] a la derecha, esto se gira desde [0, 1, 1, 1, 1]. En este momento, el rango debe reducirse a la derecha; , tenga en cuenta que no se puede dejar a la izquierda ++, porque es una matriz no descendente
    , por lo que es necesario reducir el rango a la derecha y empujar el valor más pequeño a la derecha, lo que está en línea con nuestras reglas de juicio.
  3. El medio es más pequeño que el derecho [5, 1, 2, 3, 4], en este caso, el número más pequeño está en la mitad izquierda, entonces derecho = medio
int minNumberInRotateArray(int* rotateArray, int rotateArrayLen ) {
    
    
if (rotateArrayLen == 0) return 0;
int left = 0, right = rotateArrayLen - 1, mid;
if (rotateArray[right] > rotateArray[left]) return rotateArray[0];
while(left < right) {
    
    
mid = left + (right - left) / 2;
if (rotateArray[mid] > rotateArray[right]) left=mid+1;
//中间的数大,那么我们就要往mid后面找,说明最小值在mid后面
//而且保证mid不是最小数,因为right有更小的数
else if (rotateArray[mid] == rotateArray[right]) right--;
//如果是这样的旋转数{0,1,1,1,1,1,1}
else right = mid;//中间的数小,那我们就要往右边找,而且这个中间数也可以是最小的数,所以不能写成right=mid-1
}
return rotateArray[left];//因为只有right=left的时候while循环条件不满足,那么才会退出循环,所以这里写right也对
}

Eso es todo por el compartir de hoy, trabajemos duro juntos

Supongo que te gusta

Origin blog.csdn.net/2301_76895050/article/details/131627780
Recomendado
Clasificación