欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

C++怎么實現(xiàn)在旋轉(zhuǎn)有序數(shù)組中搜索

這篇文章主要介紹了C++怎么實現(xiàn)在旋轉(zhuǎn)有序數(shù)組中搜索的相關(guān)知識,內(nèi)容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C++怎么實現(xiàn)在旋轉(zhuǎn)有序數(shù)組中搜索文章都會有所收獲,下面我們一起來看看吧。

“只有客戶發(fā)展了,才有我們的生存與發(fā)展!”這是創(chuàng)新互聯(lián)公司的服務宗旨!把網(wǎng)站當作互聯(lián)網(wǎng)產(chǎn)品,產(chǎn)品思維更注重全局思維、需求分析和迭代思維,在網(wǎng)站建設中就是為了建設一個不僅審美在線,而且實用性極高的網(wǎng)站。創(chuàng)新互聯(lián)對網(wǎng)站建設、做網(wǎng)站、網(wǎng)站制作、網(wǎng)站開發(fā)、網(wǎng)頁設計、網(wǎng)站優(yōu)化、網(wǎng)絡推廣、探索永無止境。

Search in Rotated Sorted Array 在旋轉(zhuǎn)有序數(shù)組中搜索

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e., [0,1,2,4,5,6,7] might become [4,5,6,7,0,1,2]).

You are given a target value to search. If found in the array return its index, otherwise return -1.

You may assume no duplicate exists in the array.

Your algorithm"s runtime complexity must be in the order of O(log n).

Example 1:

Input: nums = [4,5,6,7,0,1,2], target = 0
Output: 4

Example 2:

Input: nums = [4,5,6,7,0,1,2], target = 3
Output: -1

這道題讓在旋轉(zhuǎn)數(shù)組中搜索一個給定值,若存在返回坐標,若不存在返回 -1。我們還是考慮二分搜索法,但是這道題的難點在于不知道原數(shù)組在哪旋轉(zhuǎn)了,還是用題目中給的例子來分析,對于數(shù)組 [0 1 2 4 5 6 7] 共有下列七種旋轉(zhuǎn)方法(紅色表示中點之前或者之后一定為有序的):

0  1  2   4  5  6  7

7  0  1   2  4  5  6

6  7  0   1  2  4  5

5  6  7   0  1  2  4

4  5  6  7  0  1  2

2  4  5  6  7  0  1

1  2  4  5  6  7  0

二分搜索法的關(guān)鍵在于獲得了中間數(shù)后,判斷下面要搜索左半段還是右半段,觀察上面紅色的數(shù)字都是升序的,可以得出出規(guī)律,如果中間的數(shù)小于最右邊的數(shù),則右半段是有序的,若中間數(shù)大于最右邊數(shù),則左半段是有序的,我們只要在有序的半段里用首尾兩個數(shù)組來判斷目標值是否在這一區(qū)域內(nèi),這樣就可以確定保留哪半邊了,代碼如下:

解法一:

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

看了上面的解法,你可能會產(chǎn)生個疑問,為啥非得用中間的數(shù)字跟最右邊的比較呢?難道跟最左邊的數(shù)字比較不行嗎,當中間的數(shù)字大于最左邊的數(shù)字時,左半段也是有序的啊,如下所示(藍色表示中點之前一定為有序的):

0  1  2   4  5  6  7

7  0  1   2  4  5  6

6  7  0   1  2  4  5

5  6  7   0  1  2  4

4  5  6  7  0  1  2

2  4  5  6  7  0  1

1  2  4  5  6  7  0

貌似也可以做,但是有一個問題,那就是在二分搜索中,nums[mid] 和 nums[left] 還有可能相等的,當數(shù)組中只有兩個數(shù)字的時候,比如 [3, 1],那該去取那一邊呢?由于只有兩個數(shù)字且 nums[mid] 不等于 target,target 只有可能在右半邊出現(xiàn)。最好的方法就是讓其無法進入左半段,就需要左半段是有序的,而且由于一定無法同時滿足 nums[left] <= target && nums[mid] > target,因為 nums[left] 和 nums[mid] 相等,同一個數(shù)怎么可能同時大于等于 target,又小于 target。由于這個條件不滿足,則直接進入右半段繼續(xù)搜索即可,所以等于的情況要加到 nums[mid] > nums[left] 的情況中,變成大于等于,參見代碼如下:

解法二:

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

關(guān)于“C++怎么實現(xiàn)在旋轉(zhuǎn)有序數(shù)組中搜索”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“C++怎么實現(xiàn)在旋轉(zhuǎn)有序數(shù)組中搜索”知識都有一定的了解,大家如果還想學習更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享名稱:C++怎么實現(xiàn)在旋轉(zhuǎn)有序數(shù)組中搜索
文章分享:http://chinadenli.net/article0/gieooo.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供App開發(fā)云服務器網(wǎng)站收錄外貿(mào)網(wǎng)站建設搜索引擎優(yōu)化關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作