题目分析:
这一题是给定一个按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。要求编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。如:
输入: nums = [2,5,6,0,0,1,2], target = 0
输出: true
解题思路:
这个题和【LeetCode】33. Search in Rotated Sorted Array,基本一致,整体上可以采用相同的方法。当遇到[3, 1, 1]这种时候只需要把右指针循环右移到与中间值不相等的位置即可,代码如下。
测试代码:(Runtime: 40ms, faster than 97.54%)
class Solution:
def search(self, nums, target):
left, right = 0, len(nums) - 1
while left <= right:
mid = int((left + right) / 2)
if nums[mid] == target: return mid
if nums[mid] == nums[right]:
right -= 1
elif nums[mid] < nums[right]:
if nums[mid] < target and nums[right] >= target: left = mid + 1
else: right = mid - 1
else:
if nums[left] <= target and nums[mid] > target: right = mid - 1
else: left = mid + 1
return False
print(Solution().search([2,5,6,0,0,1,2], 3)) #提交时请删除该行