C言語の日常問題で回転数の最小値を求めよ

こんにちは、今日は Niuke.com のトピックであるトピックを共有します。

回転配列の最小値を見つける https://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba?tpId=13&tqId=23269&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

ではまずタイトルの意味を見てみましょう まず
ここに画像の説明を挿入
タイトルが何を意味しているのかを理解する必要がありますが、これは順序が乱れていることと、順序が乱れているのは乱数であることを誤解しないでください。
この問いに対する解決策は2つあり、1つは過去を前から後ろに向かって1つずつ比較し、最初にmin=最初の項目を定義し、それより小さい場合はminにその値を代入するというものです。これについてはご存知ですので、今日はそれについて話します。二分探索のアイデアについて書きたいと思います

二分探索は順序付けされた配列です。数値の位置を見つけたいときは、比較のために中央の数値を取得します。たとえば、昇順の配列がある場合は、中央の数値を取得し、それを必要な値と比較します。真ん中の数字より大きい場合は、その数字が真ん中の数字より後ろにあることを意味しますので、真ん中の数字の次の数字と最後の数字の真ん中の数字を取り出して比較します。 、その位置をすぐに見つけることができます

次に、このアイデアを使用してこの問題を分析できます

  1. 中央は右より大きい [3、4、5、1、2]。この場合、最小の数字は右側にある必要があり、左 = 中央 + 1
  2. 中央は右側 [1, 0, 1, 1, 1] に等しく、これは [0, 1, 1, 1, 1] から回転されます。このとき、範囲を右に狭める必要があります –;、注意してください。これは非降順
    配列であるため、 left++ にすることはできません。そのため、右側の範囲を狭め、小さい値を右側に押し出す必要があります。これは、判断ルールと一致します。
  3. 中央は右より小さい [5、1、2、3、4]。この場合、最小の数字は左半分にあり、右 = 中央になります。
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也对
}

今日の共有はここまでです、一緒に頑張りましょう

おすすめ

転載: blog.csdn.net/2301_76895050/article/details/131627780