题目
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法一(二分法)
- 思路
循环:
A-nums[mid]=target
——> 返回mid
B-nums[l]<num[r] (目标值已在顺序区间内)
——> 直接二分查找
C-nums[l]<num[mid](前半部分为顺序区间)
C1-target不在此区间内
——> l=mid+1
C2-target在此区间内
——> r=mid-1,直接二分查找
D-nums[mid]<num[r](后半部分为顺序区间)
D1-target不在此区间内
——> r=mid-1
D2-target在此区间内
——> l=mid+1,直接二分查找
E-mid<0 或 mid>lens-1(查找超出范围)
——> 返回-1
- 代码
class Solution:
def search(self, nums: List[int], target: int) -> int:
lens=len(nums)
if lens==0:
return -1
l,r=0,lens-1
flag=False
mid=0
while mid>-1 and mid<lens:
mid=(l+r)//2
if l==r and nums[l]!=target:
return -1
if nums[mid]==target:
return mid
if flag:
if target<nums[mid]:
r=mid
else:
l=mid+1
continue
if nums[mid]>=nums[l]:
if nums[l]>target or nums[mid]<target:
l=mid+1
else:
r=mid-1
flag=True
elif nums[mid]<nums[r]:
if nums[mid]>target or nums[r]<target:
r=mid-1
continue
else:
l=mid+1
flag=True
return -1
- 结果
解法二(暴力法)
- 思路
基本就是从头到尾逐一查找 - 代码
class Solution:
def search(self, nums: List[int], target: int) -> int:
lens=len(nums)
if lens==0:
return -1
if target>=nums[0]:
l=0
while l<lens:
if nums[l]==target:
return l
else:
l+=1
else:
r=lens-1
while r>-1:
if nums[r]==target:
return r
else:
r-=1
return -1
- 结果