刷題(8)leetcode 81 -- binary search

leetcode 81.?Search in Rotated Sorted Array II

這是一道m(xù)edium題甩牺,在做這道題之前蘑志,如果弄明白了leetcode 33.?Search in Rotated Sorted Array,那么做這道題目會(huì)簡單一些贬派。

33.?Search in Rotated Sorted Array 也是medium題急但。題目是說一個(gè)array是增序排列,但是呢以一個(gè)pivot做了rotate搞乏,pivot在哪個(gè)位置不定波桩,求給定的target是否在這個(gè)rotated array中存在。e.g,??Input:nums = [4,5,6,7,0,1,2], target = 0?Output:4(index)

my solution:

class Solution {

? ? public int search(int[] nums, int target) {

? ? ? ? int start =0, end = nums.length - 1;

? ? ? ? while(start<=end) {

? ? ? ? ? ? int mid = start + (end - start) / 2;

? ? ? ? ? ? if(nums[mid] == target) {

? ? ? ? ? ? ? ? return mid;

? ? ? ? ? ? } else if(nums[mid] < nums[start]) {

// we can only ensure the right part is sorted

? ? ? ? ? ? ? ? if(target > nums[mid] && target <= nums[end]) {

? ? ? ? ? ? ? ? ? ? start = mid + 1;

? ? ? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? ? ? end = mid - 1;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? } else {

// we can only ensure the left part is sorted

? ? ? ? ? ? ? ? if(target<nums[mid] && target >= nums[start]) {

? ? ? ? ? ? ? ? ? ? end = mid -1;

? ? ? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? ? ? start = mid + 1;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? return -1;

? ? }

}

做完33查描,我們?cè)倏?1突委, 81是說這個(gè)rotated array里面的數(shù)字可以重復(fù)。

如果可以重復(fù)冬三,跟33的區(qū)別就是匀油,當(dāng)mid的值和start或者end相等的時(shí)候,你不知道應(yīng)該接下來取哪一半的值勾笆,因?yàn)榭赡躮id在pivot左邊敌蚜,也可能在右邊。為了避免這種情況窝爪,我們把start和end的兩邊重復(fù)的值去掉弛车,這樣可以保證mid的值至少不會(huì)與start或者end相同。這樣就能知道接下來取哪一邊的值蒲每。

class Solution {

? ? public boolean search(int[] nums, int target) {

? ? ? ? int start =0, end = nums.length - 1;

? ? ? ? while(start<=end) {


? ? ? ? ? ? while (start < end && nums[start] == nums[start + 1])

? ? ? ? ? ? ? ? ++start;

? ? ? ? ? ? while (start < end && nums[end] == nums[end - 1])

? ? ? ? ? ? ? ? --end;


? ? ? ? ? ? int mid = start + (end - start) / 2;

? ? ? ? ? ? if(nums[mid] == target) {

? ? ? ? ? ? ? ? return true;

? ? ? ? ? ? } else if(nums[mid] < nums[start]) {

? ? ? ? ? ? ? ? if(target > nums[mid] && target <= nums[end]) {

? ? ? ? ? ? ? ? ? ? start = mid + 1;

? ? ? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? ? ? end = mid - 1;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? if(target<nums[mid] && target >= nums[start]) {

? ? ? ? ? ? ? ? ? ? end = mid -1;

? ? ? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? ? ? start = mid + 1;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? return false;

? ? }

}

這個(gè)time complexity: O(N)?worst case, O(logN)?best case, where?N is the length of the input array.

Worst case: This happens when all the elements are the same and we search for some different element. At each step, we will only be able to reduce the search space by 1 since?arr[mid]?equals?arr[start]?and it's not possible to decide the relative position of?target?from?arr[mid]. Example: [1, 1, 1, 1, 1, 1, 1], target = 2.

Best case: This happens when all the elements are distinct. At each step, we will be able to divide our search space into half just like a normal binary search.


space complexityO(1)


這道題還有一個(gè)follow up:

This problem is similar to?Search in Rotated Sorted Array, but?nums?may contain?duplicates. Would this affect the runtime complexity? How and why?

從剛剛的分析就可以看出纷跛,當(dāng)有重復(fù)值時(shí),會(huì)讓我么不能用binary search邀杏,所以這時(shí)候就多了一個(gè)最壞情況和一個(gè)最好情況贫奠。最好情況就是跟33一樣。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末望蜡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子脖律,更是在濱河造成了極大的恐慌谢肾,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件小泉,死亡現(xiàn)場(chǎng)離奇詭異芦疏,居然都是意外死亡冕杠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門眯分,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拌汇,“玉大人,你說我怎么就攤上這事弊决≡胍ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵飘诗,是天一觀的道長与倡。 經(jīng)常有香客問我,道長昆稿,這世上最難降的妖魔是什么纺座? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮溉潭,結(jié)果婚禮上净响,老公的妹妹穿的比我還像新娘。我一直安慰自己喳瓣,他們只是感情好馋贤,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著畏陕,像睡著了一般配乓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惠毁,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天犹芹,我揣著相機(jī)與錄音,去河邊找鬼鞠绰。 笑死腰埂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蜈膨。 我是一名探鬼主播盐固,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼丈挟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起志电,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤曙咽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后挑辆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體例朱,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡孝情,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了洒嗤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片箫荡。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖渔隶,靈堂內(nèi)的尸體忽然破棺而出羔挡,到底是詐尸還是另有隱情,我是刑警寧澤间唉,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布绞灼,位于F島的核電站,受9級(jí)特大地震影響呈野,放射性物質(zhì)發(fā)生泄漏低矮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一被冒、第九天 我趴在偏房一處隱蔽的房頂上張望军掂。 院中可真熱鬧,春花似錦昨悼、人聲如沸蝗锥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽玛追。三九已至,卻和暖如春闲延,著一層夾襖步出監(jiān)牢的瞬間痊剖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來泰國打工垒玲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留陆馁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓合愈,卻偏偏與公主長得像叮贩,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子佛析,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

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