題目描述:一個(gè)排好序的序列在某個(gè)值處翻轉(zhuǎn)了镰惦,如0 1 2 4 5 6 7變?yōu)?4 5 6 7 0 1 2。序列中的數(shù)無(wú)重復(fù)犬绒,在這個(gè)翻轉(zhuǎn)后的序列中查找目標(biāo)值并返回下標(biāo)旺入,沒(méi)找到則返回-1。
分析:有序序列中查找值可用二分法凯力,現(xiàn)在在某個(gè)值處旋轉(zhuǎn)后茵瘾,則變?yōu)閮啥斡行蛐蛄小S枚值乃枷刖谛裟繕?biāo)值所在數(shù)據(jù)段不包含斷點(diǎn)則按原二分法即可慎璧;若包含斷點(diǎn)則范圍也可縮小趁矾。故一層條件判斷斷點(diǎn)所在段,每層中繼續(xù)判斷目標(biāo)值所在段芹关,共4種情況晨雳,找例子分析即可得到不同情況取哪段行瑞。總之目標(biāo)值是在一段有序序列中餐禁。時(shí)間復(fù)雜度O(lgn)血久,空間O(1)。
代碼:
class Solution {
public:
int search(vector<int>& nums, int target) {
int l = 0, r = nums.size();
while(l != r)
{
int mid = (l + r) / 2;
if (nums[mid] == target)
return mid;
//首先分為l ~ mid, mid ~ r兩段帮非,由于不知道斷點(diǎn)在哪段故分條件處理
if (nums[l] <= nums[mid]) //斷點(diǎn)不在l ~ mid
{
if (nums[l] <= target && target < nums[mid]) //目標(biāo)值在l ~ mid
r = mid;
else //目標(biāo)值不在l ~ mid
l = mid + 1;
}
else //斷點(diǎn)在l ~ mid氧吐,則mid ~ r無(wú)斷點(diǎn)
{
if (nums[mid] < target && target <= nums[r - 1]) //目標(biāo)值在mid ~ r
l = mid + 1;
else //目標(biāo)值不在mid ~ r
r = mid;
}
}
return -1;
}
};