您的位置:首页 > 其它

变形的二分查找

2016-10-18 10:29 267 查看
在旋转有序数组中查找特定值

1.数组中没有重复的数,查找特定值,若存在,返回其下标,若不存在,返回-1

如[10,12,1,2,6,8] 12 返回1

[10,12,1,2,6,8] 0 返回-1

2.数组中有重复的数,查找特定值,若存在,返回true,若不存在,返回false

如[10,12,12,1,2,6,8,10] 10 返回true

[10,12,12,1,2,6,8,10] 0 返回false

1.Search in Rotated Sorted Array

数组中没有重复的数

若nums[start]<=nums[mid],则左半部分递增,先在左半部分搜索

若搜索不到,则往右半部分搜索

若nums[start]>nums[mid],则右半部分递增,先在右半部分搜索

若搜索不到,则往左半部分搜索

class Solution {
public:
int search(vector<int>& nums, int target) {
const int size=nums.size();
int start=0,end=size-1;

while(start<=end)
{
int mid=start+(end-start)/2;
if(nums[mid]==target)
return mid;

if(nums[start]<=nums[mid])
{
if(nums[start]<=target&&target<nums[mid])
end=mid-1;
<
4000
span class="hljs-keyword">else
start=mid+1;
}
else
{
if(nums[mid]<target&&target<=nums[end])
start=mid+1;
else
end=mid-1;
}
}

return -1;
}
};


2.Search in Rotated Sorted Array II

数组中存在重复的数,则当nums[start]==nums[mid]

无法确定数组的递增序列,需要进一步查找

class Solution {
public:
bool search(vector<int>& nums, int target) {
const int size=nums.size();
int start=0,end=size-1;

while(start<=end)
{
int mid=start+(end-start)/2;
if(nums[mid]==target)
return true;

if(nums[start]<nums[mid])
{
if(nums[start]<=target&&target<nums[mid])
end=mid-1;
else
start=mid+1;
}
else if(nums[start]>nums[mid])
{
if(nums[mid]<target&&target<=nums[end])
start=mid+1;
else
end=mid-1;
}
else
++start;
}

return false;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息