ソードフィンガーオファー11.アレイ(C ++)の二分法の最小数を回転させます

配列の最初から最後までいくつかの要素を移動することを、配列の回転と呼びます。昇順で並べ替えられた配列の回転を入力し、回転された配列の最小要素を出力します。たとえば、配列[3,4,5,1,2]は[1,2,3,4,5]の回転であり、配列の最小値は1です。

例1:

输入:[3,4,5,1,2]
输出:1

例2:

输入:[2,2,2,0,1]
输出:0

注:この質問は、メインWebサイトの質問154と同じです:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array-ii/

問題解決のアイデア:

長さを単純化するために、この記事では配列番号をnumsと省略しています。

次の図に示すように、回転配列の最小要素を見つけることは、右にソートされた配列の最初の要素nums [x]を見つけ、xを回転点として呼び出すことです。
ここに画像の説明を挿入します
ソートされた配列の探索問題は、最初に二分法によって解決されると見なされます。これにより、トラバーサル法の線形レベルの時間計算量を対数レベルに減らすことができます。
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します

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;//当 nums[m] > nums[j] 时: 
            //m 一定在 左排序数组 中,
            //即旋转点 x 一定在 [m + 1, j] 闭区间内,因此执行 i = m + 1;
            else if (numbers[m] < numbers[j]) j = m;
            else {
    
    
                int x = i;
                for(int k = i + 1; k < j; k++) {
    
    
                    if(numbers[k] < numbers[x]) x = k;
                }
                return numbers[x];
            }
        }
        return numbers[i];
    }
};

著者:jyd
リンク:https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof/solution/mian-shi-ti-11-xuan-zhuan -shu-zu-de-zui-xiao-shu-3 /
出典:LeetCode(LeetCode)
著作権は作者に帰属します。商用の転載の場合は、著者に連絡して許可を求め、非商用の転載の場合は、出典を示してください。

おすすめ

転載: blog.csdn.net/qq_30457077/article/details/114849181
おすすめ