您的位置:首页 > 其它

LeetCode Search in Rotated Sorted Array

2014-04-23 22:50 148 查看
class Solution {
public:
int search(int A[], int n, int target) {
if (n < 1) return -1;

int left = -1, right = n, mid;
int last = A[n-1];
while (left + 1 < right) {
mid = (right + left) / 2;
if (A[mid] < last) {
right = mid;
} else if (A[mid] > last) {
left = mid;
} else {
right = mid; // only when n == 1
}
}

if (last > target) {
right = n;
} else if (last < target){
left = -1;
} else {
return n-1;
}
while(left + 1 < right) {
mid = (right + left) / 2;
if (A[mid] < target) {
left = mid;
} else if (A[mid] > target) {
right = mid;
} else {
return mid;
}
}
return -1;
}
};


先用二分找出分界元素,然后根据所要搜索数值和最后一个数的大小关系确定在那一段内搜索。

第二轮:

对于重复数字数组可以采用稍微简单一点的方法,不用先特地求出分界:

class Solution {
public:
int search(vector<int>& nums, int target) {
int len = nums.size();
int lo = 0;
int hi = len - 1;
while (lo < hi) {
int mid = (lo + hi) / 2;
if (nums[mid] == target) {
return mid;
}
if (nums[mid] >= nums[lo]) {
if (nums[lo] <= target && nums[mid] >= target) {
hi = mid;
} else {
lo = mid + 1;
}
} else {
if (nums[mid] <= target && nums[hi] >= target) {
lo = mid + 1;
} else {
hi = mid;
}
}
}
if (lo < len && nums[lo] == target) {
return lo;
}
return -1;
}
};


当有重复数字是`nums[mid] >= nums[lo]`判断就会有问题了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: