33. Search in Rotated Sorted Array

題目

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.

分析

直接搜索是O(n)的復(fù)雜度,要利用排序的信息的話要求應(yīng)該是O(log(n))。所以首先排除通過線性掃描找到最大值確定頭尾的方法询吴。
但是如果不知道最大值宦芦,我真的是不知道怎么操作卵皂,所以考慮用O(log(n))的方法尋找最大值的位置童本。
由于最大值左側(cè)的數(shù)一定比最大值右側(cè)的數(shù)大(如果最大值在中間的話),可以這點(diǎn)逐步縮小搜索空間。
在區(qū)間[a, b]中婿脸,取其中點(diǎn)c,則有以下情況:

  • a<=b:b為最大值(已經(jīng)假設(shè)沒有重復(fù)元素似枕,但如果a,b為同一元素則需要返回)
  • a>b且a>=c:最大值在(a, c)之間(使用等于號(hào)是考慮到a,c為同一元素的情況)
  • a>b且a<c:最大值在(c, b)之間

找到最大值后使用二分法即可完成查找盖淡。

實(shí)現(xiàn)

class Solution {
public:
    int search(vector<int>& nums, int target) {
        if(nums.size()==0) return -1;
        int idxmax = binary_max(nums, 0, nums.size()-1);
        if(target>=nums[0]){
            auto itu = lower_bound(nums.begin(), nums.begin()+idxmax+1, target);
            if(itu==nums.begin()+idxmax+1 || *itu!=target) return -1;
            return itu - nums.begin();
        }
        else{
            auto itv = lower_bound(nums.begin()+idxmax+1, nums.end(), target);
            if(itv==nums.end() || *itv!=target) return -1;
            return itv - nums.begin();
        }
    }

private: 
    int binary_max(vector<int>& nums, int start, int end){
        if(nums[start]<=nums[end])
            return end;
        int mid = (start + end) / 2;
        if(nums[start]>=nums[mid])
            return binary_max(nums, start, mid);
        else
            return binary_max(nums, mid, end);
    }
};

思考

做得有點(diǎn)慢,關(guān)于stl的這些東西還是要熟練啊凿歼。
中間因?yàn)闆]用小于等于改了好多次褪迟,邊界情況開始要注意啊。
另外看所用時(shí)間答憔,感覺不用遞歸以及stl會(huì)快一點(diǎn)=_=

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末味赃,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子虐拓,更是在濱河造成了極大的恐慌心俗,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蓉驹,死亡現(xiàn)場(chǎng)離奇詭異城榛,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)态兴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門狠持,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瞻润,你說我怎么就攤上這事喘垂。” “怎么了绍撞?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵正勒,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我傻铣,道長(zhǎng)章贞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任非洲,我火速辦了婚禮阱驾,結(jié)果婚禮上就谜,老公的妹妹穿的比我還像新娘。我一直安慰自己里覆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布缆瓣。 她就那樣靜靜地躺著喧枷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪弓坞。 梳的紋絲不亂的頭發(fā)上隧甚,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音渡冻,去河邊找鬼戚扳。 笑死,一個(gè)胖子當(dāng)著我的面吹牛族吻,可吹牛的內(nèi)容都是我干的帽借。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼超歌,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼砍艾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起巍举,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤脆荷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后懊悯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜓谋,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年炭分,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了桃焕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡欠窒,死狀恐怖覆旭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情岖妄,我是刑警寧澤型将,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站荐虐,受9級(jí)特大地震影響七兜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜福扬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一腕铸、第九天 我趴在偏房一處隱蔽的房頂上張望惜犀。 院中可真熱鬧,春花似錦狠裹、人聲如沸虽界。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽莉御。三九已至,卻和暖如春俗冻,著一層夾襖步出監(jiān)牢的瞬間礁叔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工迄薄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留琅关,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓讥蔽,卻偏偏與公主長(zhǎng)得像涣易,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子勤篮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容