leetcode題庫——搜尋旋轉排序陣列
阿新 • • 發佈:2018-11-11
題目描述:
假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。
( 例如,陣列 [0,1,2,4,5,6,7]
可能變為 [4,5,6,7,0,1,2]
)。
搜尋一個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 -1
。
你可以假設陣列中不存在重複的元素。
你的演算法時間複雜度必須是 O(log n) 級別。
示例 1:
輸入: nums = [4,5,6,7,0,1,2], target = 0 輸出: 4
示例 2:
輸入: nums = [4,5,6,7,0,1,2], target = 3 輸出:-1
方法:二分搜尋
class Solution { public: int search(vector<int>& nums, int target) { if(nums.size()==0) return -1; int low,mid,high; low=0;high=nums.size()-1; while(low<high){ mid=(low+high)/2; if(nums[mid]==target) return mid; if(nums[mid]>=nums[low]){//左邊半有序 if(nums[mid]>target&&nums[low]<=target)//目標值在左邊 high=mid-1; else low=mid+1; } else{//右邊半有序 if(nums[mid]<=target&&nums[high]>=target)//目標值在右邊 low=mid+1; else high=mid-1; } } if(low==high&&nums[low]==target) return low; return -1; } };
思路:
題目要求複雜度為log(n),故最有可能的方法就是二分搜尋。但是由於給定的數字序列順序旋轉,所以在判斷時需要注意,mid左邊還是右邊是有序的,還要判斷目標值在左邊還是右邊。只有當目標值在有序的一邊,才可以用傳統的二分辦法,即中間值比目標值大,則high=mid-1,或中間值比目標值小,則low=mid+1。