我们的口号是:使用最简洁的代码,完成AC:)
题目介绍
升序排列的整数数组 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
题目分析
该题是一个典型的二叉搜索题,利用数组局部有序的特征,可以每次过滤一半数据。
题目中给出的测试样例有一个全升序排列特例,需要对其进行特殊处理:)
python代码
class Solution:
def search(self, nums: List[int], target: int) -> int:
n = len(nums)
l, r = 0, n-1
while(l <= r):
mid = (l+r) / 2
if target == nums[mid]:
return mid
elif nums[mid] > nums[l]:
if target > nums[mid]:
l = mid + 1
else:
r = mid - 1
elif nums[mid] <= nums[l] and l != mid:
if target > nums[mid] and target < nums[l]:
l = mid + 1
else:
r = mid - 1
elif nums[mid] <= nums[l] and l == mid: #对仅剩两个元素时的数组进行特例处理
l = mid + 1