您的位置:首页 > 其它

解题报告:LeetCode Search in Rotated Sorted Array II(循环数字查找)

2015-12-15 18:31 453 查看
题目出处:https://leetcode.com/problems/search-in-rotated-sorted-array-ii/

题意描述:

给定一循环数组,查找目标值是否在该数组中。

解决思路:

由于这是Search in Rotated Sorted Array的后续题目,因此我想为了解决这道题我们有必要先解决上一道题。也就是不重复的情况下的查找。由于数组不重复,因此我们只需要先找出突变的位置即可调用经典的二分查找。而查找突变位置也可以通过二分的方式给出。附代码如下(其中find_mid函数为寻找突变点的函数,binary_search为普通的二分查找,search在调用find_mid获得突变点的位置后调用binary_search查找并获取结果)。

class Solution {
public:
int find_mid(vector<int>& nums, int l, int r)
{
if(l == r)
return r;
int pos = (r+l)/2;
if(nums[pos] >= nums[0] && nums[pos+1] < nums[0])
return pos;
else if(nums[pos] < nums[0])
return find_mid(nums, l, pos-1);
else
return find_mid(nums, pos+1, r);
};

int binary_search(vector<int>& nums, int target, int l, int r)
{
if(l > r)
return -1;

int mid = (l+r)/2;
if(nums[mid] == target)
return mid;
else if(nums[mid] < target)
return binary_search(nums, target, mid+1, r);
else
return binary_search(nums, target, l, mid-1);
}

bool search(vector<int>& nums, int target) {
int mid = find_mid(nums, 0, nums.size()-1);
int pos;
if(nums[0] > target)
{
if(mid < nums.size()-1)
pos =  binary_search(nums, target, mid+1, nums.size()-1);
else
pos = -1;
}
else
pos = binary_search(nums, target, 0, mid);
return (pos != -1);
};
};


View Code
果然,上述代码跪了,对样例分析可知,在首位和中间的值均相等时,函数无法确定突变点在左半区间还是右半区间。于是我们需要对此特殊情况进行处理。我的做法是判定这三个值均相等时修改上界或下界,再递归调用函数求解。代码如下:

class Solution {
public:
int find_mid(vector<int>& nums, int l, int r)
{
if(l == r)
return r;
int pos = (r+l)/2;
if(nums[pos] >= nums[0] && nums[pos+1] < nums[0])
return pos;
else if(nums[pos] < nums[0])
return find_mid(nums, l, pos-1);
else if(nums[pos] > nums[0])
return find_mid(nums, pos+1, r);
else
{
if(nums[r] == nums[pos])
r --;
else
l ++;
return find_mid(nums, l, r);
}
};

int binary_search(vector<int>& nums, int target, int l, int r)
{
if(l > r)
return -1;

int mid = (l+r)/2;
if(nums[mid] == target)
return mid;
else if(nums[mid] < target)
return binary_search(nums, target, mid+1, r);
else
return binary_search(nums, target, l, mid-1);
}

bool search(vector<int>& nums, int target) {
int mid = find_mid(nums, 0, nums.size()-1);
int pos;
if(nums[0] > target)
{
if(mid < nums.size()-1)
pos =  binary_search(nums, target, mid+1, nums.size()-1);
else
pos = -1;
}
else
pos = binary_search(nums, target, 0, mid);
return (pos != -1);
};
};


上述代码获得了AC。OK,吃饭去了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: