No33. 搜索旋转排序数组
题目
升序排列的整数数组 nums 在预先未知的某个点上进行了旋转(例如, [0,1,2,4,5,6,7] 经旋转后可能变为 [4,5,6,7,0,1,2] )。
请你在数组中搜索 target ,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
示例 1
- 输入:nums = [4,5,6,7,0,1,2], target = 0
- 输出:4
示例 2
- 输入:nums = [4,5,6,7,0,1,2], target = 3
- 输出:-1
示例 3
- 输入:nums = [1], target = 0
- 输出:-1
提示
提示:
- 1 <= nums.length <= 5000
- -10^4 <= nums[i] <= 10^4
- nums 中的每个值都 独一无二
- nums 肯定会在某个点上旋转
- -10^4 <= target <= 10^4
解题代码(Python3)
class Solution:
def search(self, nums: List[int], target: int) -> int:
left = nums[0]
right = nums[-1]
length = len(nums)
if right < target < left:
return -1
elif target >= left:
i = 0
while i < length:
if nums[i] > target:
return -1
elif nums[i] == target:
return i
i += 1
else:
i = length - 1
while i >= 0:
if nums[i] < target:
return -1
elif nums[i] == target:
return i
i -= 1
return -1
思路:
因为左侧区域内的数一定是整体大于右侧区域内的,所以要先判断左右两端的值和target的关系:
- 如果处于两值之间,那么说明不存在target
- 如果大于等于left,要从左边开始向右遍历
- 如果小于等于right,要从右边开始向左遍历
复杂度分析:
- 时间复杂度O(n) 但比直接遍历节省时间
- 空间复杂度O(1)