二分查找:33. 搜索旋轉(zhuǎn)排序數(shù)組(中等)

整數(shù)數(shù)組 nums 按升序排列,數(shù)組中的值 互不相同 。

在傳遞給函數(shù)之前,nums 在預(yù)先未知的某個下標(biāo) k(0 <= k < nums.length)上進(jìn)行了 旋轉(zhuǎn),使數(shù)組變?yōu)?[nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下標(biāo) 從 0 開始 計數(shù))。例如, [0,1,2,4,5,6,7] 在下標(biāo) 3 處經(jīng)旋轉(zhuǎn)后可能變?yōu)?[4,5,6,7,0,1,2] 。

給你 旋轉(zhuǎn)后 的數(shù)組 nums 和一個整數(shù) target ,如果 nums 中存在這個目標(biāo)值 target ,則返回它的下標(biāo),否則返回?-1?。

示例 1:輸入:nums = [4,5,6,7,0,1,2], target = 0

? ? ? ? ? ? ? 輸出:4

解題思路:設(shè)計一個時間復(fù)雜度為?O(log n)?的解決方案,即二分查找。

將數(shù)組一分為二,其中一定有一個是有序的,另一個可能是有序,也能是部分有序。此時有序部分用二分法查找。無序部分再一分為二,其中一個一定有序,另一個可能有序,可能無序。就這樣循環(huán)....

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

????????int?low?=?0;

????????int?high?=?nums.length?-?1;

????????while?(low?<=?high)?{

????????????int?mid?=?(low?+?high)/2;?// 定義中間值

????????????if(nums[mid]?==?target)?{?// 如果找到了直接返回

????????????????return?mid;

????????????}

????????????if(nums[mid]?<=?nums[high])?{ //如果右邊有序

????????????????if?(target?>=?nums[mid]?&&?target?<=?nums[high])?{??//target在有序部分,用二分法查找

????????????????????low?=?mid+1;

????????????????}?else?{???//target在無序部分,?再一分為二

????????????????????high?=?mid-1;

????????????????}

????????????}

????????????if(nums[mid]?>=?nums[low])?{?//如果左邊有序

????????????????if?(target?>=?nums[low]?&&?target?<=nums[mid])?{? //target在有序部分,用二分法查找

????????????????????high?=?mid-1;

????????????????}?else?{?//target在無序部分,再一分為二

????????????????????low?=?mid+1;

????????????????}

????????????}

????????}

????????return?-1; //未找到返回-1

????}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容