剣はオファーを指します-------回転アレイの最小数

ここに画像の説明を挿入

アイデア:この
質問は実際には少し注意が必要です。これは、配列Limanの値が重複している場合です。たとえば、3,1,1,2,2,2,2,2の場合、この質問は間違いなく二分法で行われます。配列の最後の要素の境界を見つけるだけで済みますが、恐れています。特別な場合、ここでのアプローチは、分割線の端にある要素を1桁前方に移動し、前の要素を使用して分割線を見つけることです。前の要素に重複する値がある場合は、前方に移動します。

コード:

class Solution {
    
    
public:
    int minArray(vector<int>& numbers) {
    
    
        int i = 0, j = numbers.size() - 1;
        while (i < j) {
    
    
            int m = (i + j) / 2;
            if (numbers[m] > numbers[j]) i = m + 1;
            else if (numbers[m] < numbers[j]) j = m;
            else j--;
        }
        return numbers[i];
    }
};

おすすめ

転載: blog.csdn.net/weixin_43743711/article/details/115067229
おすすめ