使用の方向回転したソート配列の二分法の変更で33件の検索

回転したソート配列で33件の検索

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

(すなわち、  [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

参考:https://blog.csdn.net/qq_26410101/article/details/80665577

問題解決のアイデア:

時間が必要な複雑性O(ログn)があるため、それは二分法であるべきです。タイトルからは、注文され、その後、どのように配列の一部を決定するために、アレイは、途中で2つの部分に分かれている場合、アレイは、その後、少なくとも一部が発注され、注文され見ることができますか?すなわち、この中間の列の計算された数(右+左)場合/ 2、MIDが>右、左の列は数がどのように命じました。ミッド場合は<右、右の列の数が発注されています。その部分は、列の数を見つけるために注文された場合、あなたは(前提の二分法は、列の数を注文する必要があります)二分法を見つけるために使用することができます。もし注文番号数は内部に順序付けられたシーケンスかどうかは不明である場合、その部分の列数、バイナリサーチは、その後、オーダーのその部分を見つけるために、二つの部分にシリーズを続け、その後に戻った場合上記の手順。

あなたは上記の考え方を理解していない場合は、リンクが提供して参照することができ、理解するのを助けることができる例があります。

注:バイナリ検索を実行し、左と右の時間の値を変更すると、ままにしておく必要があり、ミッド+ 1またはミッド1 =右、右=半ば、ままにすることはできません、それ以外の場合は、無限ループに陥っされていたであろう。

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int cnt = nums.capacity();
        int left = 0, right = cnt-1;
        int mid = cnt / 2;
        while(left<=right) {
            mid = (left + right) / 2;
            if(nums[mid]==target) return mid;
            if(nums[mid] > nums[right]) {
                // left
                if(target>=nums[left] && target <=nums[mid]) {
                    right = mid-1;
                }
                else {
                    left = mid+1;
                }
            }
            else {
                if(target>=nums[mid] && target <=nums[right]) {
                    left = mid+1;
                }
                else {
                    right = mid-1;
                }
            }
        }
        return -1;
    }
};

 

公開された147元の記事 ウォン称賛29 ビュー10万+

おすすめ

転載: blog.csdn.net/Haskei/article/details/104073961