33. 搜索旋转排序数组
问题描述
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7]
可能变为 [4,5,6,7,0,1,2]
)。
搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1
。
你可以假设数组中不存在重复的元素。
你的算法时间复杂度必须是 O(log n) 级别。
示例 1:
输入: nums = [4,5,6,7,0,1,2], target = 0
输出: 4
示例 2:
输入: nums = [4,5,6,7,0,1,2], target = 3
输出: -1
解决方案
这里需要解决的是序列的由于旋转所带来的问题
- 如果是正序,那么回归到常规的二分查找
- 如果还存在逆序,nums[low]是最大值
- target比mid大,high为mid-1
- target比mid小,low为mid+1
时间复杂度:O(log(n))
show me the code
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@Author : Young
@Email : hyc554@outlook.com
@site : http://www.cnblogs.com/huang-yc/
@File : leet33.py
@version : 1.0
@Time : 2019/4/16 19:33
Description about this file:
"""
class Solution:
def search(self, nums, target):
if not nums:
return -1
low, high = 0, len(nums) - 1
while low <= high:
mid = (low + high) // 2
if target == nums[mid]:
return mid
if nums[low] <= nums[mid]: # 当前全序列已经是正序
if nums[low] <= target <= nums[mid]: # 目标值在最低值与中间值之间
high = mid - 1 # 最高索引变为中间值-1位
else: # 目标值在中间值与最高值之间
low = mid + 1 # 最低索引变为中间索引+1
else: # 当前序列存在反序列
if nums[mid] <= target <= nums[high]: # 目标值在中间值与最高值之间
low = mid + 1 # 最低索引变为中间值+1位
else: # 目标值在最低值与中间值之间
high = mid - 1 # 最高索引变为中间值-1位
return -1
if __name__ == '__main__':
a = Solution()
nums = [9,8,2,3,4,6,7]
target = 3
b =a.search(nums,target)
print(b)
本文来自博客园,作者:YanceDev,转载请注明原文链接:https://www.cnblogs.com/yance-dev/p/10719734.html