回転したソート配列に033検索[LeetCodeレポートを解決します]

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/caicaiatnbu/article/details/102772077

昇順にソート配列は、事前にあなたにいくつかのピボット不明で回転させるとします。

(すなわち、  [0,1,2,4,5,6,7] なるかもしれません  [4,5,6,7,0,1,2])。

あなたが検索した目標値を与えています。配列で見つかった場合は、そのインデックスを返し、そうでない場合は返します  -1

あなたは重複が配列に存在しないと仮定して。

あなたのアルゴリズムの実行時の複雑さは、の順番でなければなりません  O(ログ  nで)。

例1:

入力: NUMS = [4,5,6,7,0,1,2]、目標= 0
 出力: 4

例2:

入力: NUMS = [4,5,6,7,0,1,2]、ターゲット= 3
 出力: -1

訪問:バイナリ検索は、我々は最初にすべての回転状況アレイNUMSの= [0,1,2,4,5,6,7]の、以下のよう

  • 0,1、-1,2,4,5,6,7-
  • 1,2,4,5、 6,7,0
  • 2,4,5,6、 7,0,1
  • 4,5,6,7、 0,1,2
  • 5,6,7、0,1,2,4
  • 6,7,0、1,2,4,5
  • 7,0,1、2,4,5,6

それはどんなに回転、または秩序、あるいは後半と秩序の前半、見出すことができない。裁判官は、前半を注文したか後半はそれを注文しているので、どのように。

  • NUMS [中期] <NUMS [右]半分整然とした後
  • NUMS [左] <NUMS [中期]は、前半を命じました
class Solution {
public:
    int search(vector<int>& nums, int target) {
        if (nums.size() < 1 || (nums.size() == 1 && nums[0] != target))
            return -1;
        int left = 0, right = nums.size()-1;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (nums[mid] == target)
                return mid;
            else if (nums[mid] < nums[right]) { //后半段有序
                if (nums[mid] < target && nums[right] >= target)
                    left = mid + 1;
                else
                    right = mid - 1;
            }
            else { // 前半段有序
                if (nums[left] <= target && target < nums[mid])
                    right = mid - 1;
                else
                    left = mid + 1;
            }
        }
        return -1;
    }
};

完成しました、 

おすすめ

転載: blog.csdn.net/caicaiatnbu/article/details/102772077