Search in Rotated Sorted Array
Solution 1
已知输入序列有顺序,因此寻找目标值的理想状态就是二分了。只不过这里的二分的判断条件略微复杂,因为是一个升序数组旋转移位后的结果。下面为了方便讨论,将整个数组按照两个升序列分为左列和右列。根据旋转位移的性质,左列最小元素必大于右列最大元素。
- 如果中间元素大于右列最大元素,那么中点元素在左列中。target在右侧的性质是比中间元素大或者比右列最大元素小,反之则在左侧
- 如果中间元素小于右列最大元素,那么中点元素在右列中。target在右侧的性质是比中间元素大且比右列最大元素小,反之则在右侧
- 当且仅当考察空间只剩一个元素是考察是否匹配
- 时间复杂度 O ( log N ) O(\log N) O(logN),其中 N N N为输入序列的长度
- 空间复杂度 O ( log N ) O(\log N) O(logN),其中 N N N为输入序列的长度,递归实现下的函数空间申请占用
class Solution {
public:
int search(vector<int>& nums, int target) {
int ans = this->searchBinary(nums, target, 0, nums.size() - 1);
return ans;
}
private:
int searchBinary(vector<int>& nums, int target, int left, int right) {
if (left >= right) {
if (nums[left] == target) {
return left;
}
else {
return -1;
}
}
int mid = (left + right) / 2;
if (nums[mid] > nums[right]) {
if (target > nums[right] && target <= nums[mid]) {
return this->searchBinary(nums, target, left, mid);
}
else {
return this->searchBinary(nums, target, mid + 1, right);
}
}
else {
if (target > nums[mid] && target <= nums[right]) {
return this->searchBinary(nums, target, mid + 1, right);
}
else {
return this->searchBinary(nums, target, left, mid);
}
}
}
};
Solution 2
Solution 1的Python实现
class Solution:
def search(self, nums: List[int], target: int) -> int:
return self.__searchBinary(nums, target, 0, len(nums) - 1)
def __searchBinary(self, nums: List[int], target: int, left: int, right: int) -> int:
if left >= right:
if nums[left] == target: return left
else: return -1
mid = (left + right) // 2
if nums[mid] > nums[right]:
if target > nums[right] and target <= nums[mid]:
return self.__searchBinary(nums, target, left, mid)
else:
return self.__searchBinary(nums, target, mid + 1, right)
else:
if target > nums[mid] and target <= nums[right]:
return self.__searchBinary(nums, target, mid + 1, right)
else:
return self.__searchBinary(nums, target, left, mid)