Niuke.comブラッシングの質問-回転した順序付き配列でターゲット値を見つけます

問題の説明

回転された順序付けられた配列を考えると、配列がどれだけ回転されたかは事前にわかりません。
配列内で指定されたターゲット値を検索します。配列内で見つかった場合はそのインデックスを返し、そうでない場合は-1を返します。
配列に重複がないと仮定します。

入力の説明:
回転配列を入力します

出力の説明:
出力ターゲット値のインデックス

例1


[3,2,1]、1と入力します

出力
2

ソリューション

分析

  1. 変形二分探索を使用します。

方法

  1. タイトルは回転配列として与えられていますが、正しい間隔で二分法を使用できます

二分法の3つの変数:start、end、
mid。arr[mid] <arr [end]の場合、midが低間隔にあり、低間隔が開始の条件(を見つける理由)を探していることを意味します。開始の条件は、開始が移動していることであり、ターゲットが通常の範囲内にあることを示します)、他の条件の移動可能な端は、
条件原因arr [mid]> = arr [ end]であり、最後に記述されている条件は、中域高、高ダイナミックレンジ(移動端、可動端を見つけるため、ターゲットが通常の範囲にあることを説明する)、その他はすべて開始条件です

コード

// 思路1
public class Solution {
    
      
    public int search(int[] arr, int target) {
    
    
        // write code here
        int start = 0, end = arr.length - 1;
        while (start <= end) {
    
    
            int mid = start + (end - start) / 2;
            if (arr[mid] == target) {
    
    
                return mid;
            } else if (arr[mid] < arr[end]) {
    
    
                if (arr[mid] < target && target <= arr[end]) {
    
    
                    start = mid + 1;
                } else {
    
    
                    end = mid - 1;
                }
            } else {
    
    
                if (arr[start] <= target && target < arr[mid]) {
    
    
                    end = mid - 1;
                } else {
    
    
                    start = mid + 1;
                }
            }
        }

        return -1;
    }
}

時間計算量分析:
O(logN):バイナリ検索が使用されるため、時間計算量はlogNです。

スペースの複雑さの分析:
O(1):余分なスペースは使用されません

テストしたい場合は、Niuke.comのリンクに直接アクセスしてテストを行うことができます

回転した順序付き配列でターゲット値を見つけます

おすすめ

転載: blog.csdn.net/qq_35398517/article/details/113621460