Trouver la valeur minimale du nombre de rotations dans la question quotidienne en langage C

Bonjour, aujourd'hui nous partageons un sujet, qui est un sujet sur Niuke.com

Trouvez la valeur minimale dans le tableau de rotation https://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba?tpId=13&tqId=23269&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

Ensuite, regardons la signification du titre. Tout d'abord, nous devons comprendre de quoi
insérez la description de l'image ici
parle le titre. Ceci, mais ne vous méprenez pas sur le fait qu'il est dans le désordre, et dans le désordre, ce sont des nombres aléatoires.
Il y a deux solutions à cette question. La première est que nous comparons les passés un par un de l'avant vers l'arrière, définissons d'abord a min=le premier élément, puis attribuons la valeur à min s'il est plus petit que lui. sachez cela, alors aujourd'hui nous en parlerons. Laissez-moi vous écrire avec l'idée de la recherche binaire

La recherche binaire est un tableau ordonné. Lorsque nous voulons trouver la position d'un nombre, nous prenons le nombre du milieu pour comparaison. Par exemple, s'il existe un tableau croissant, nous prenons le nombre du milieu et le comparons avec la valeur que nous voulons. S'il est supérieur au nombre du milieu, cela signifie que ce nombre est derrière le nombre du milieu, alors nous prenons le nombre après le nombre du milieu au nombre du milieu du dernier nombre, et les comparons.Après avoir trouvé le nombre de cette façon , on peut rapidement trouver sa position

Ensuite, nous pouvons utiliser cette idée pour analyser ce problème

  1. Le milieu est plus grand que la droite [3, 4, 5, 1, 2], dans ce cas, le plus petit nombre doit être à droite ; alors gauche = milieu + 1
  2. Le milieu est égal à [1, 0, 1, 1, 1] sur la droite, il est tourné à partir de [0, 1, 1, 1, 1]. À ce moment, la plage doit être réduite à droite- ; , notez qu'il ne peut pas être left++, car il s'agit d'un tableau non décroissant
    , il est donc nécessaire de réduire la plage à droite et de pousser la plus petite valeur vers la droite, ce qui est conforme à nos règles de jugement.
  3. Le milieu est plus petit que le droit [5, 1, 2, 3, 4], dans ce cas, le plus petit nombre est sur la moitié gauche ; alors droite = milieu
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也对
}

C'est tout pour le partage d'aujourd'hui, travaillons dur ensemble

Je suppose que tu aimes

Origine blog.csdn.net/2301_76895050/article/details/131627780
conseillé
Classement