一.问题描述
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7
might become 4 5 6 7 0 1 2
).
You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.
二.算法实现
其实还是二分查找的思想,只是在指针移动上多了很多需要判断的条件。具体代码如下:
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
# 还是二分查找的思想,只是指针移动的条件有所改变
len_nums = len(nums)
left = 0
right = len_nums-1
mid = (left+right)/2
while left<=right:
if nums[mid] == target:
return mid
elif nums[left] == target:
return left
elif nums[right] ==target:
return right
elif nums[left]<nums[mid]: # 说明左侧list是递增的
if target>=nums[left] and target<=nums[mid]:
right = mid
mid = (left+mid)/2
else:
left = mid
mid = (right+mid)/2
elif target>=nums[mid] and target<=nums[right]:
left = mid
mid = (mid+right)/2
if mid == left:
return -1
else:
right = mid
mid = (mid+left)/2
if mid == right:
return -1
return -1
代码写的很烂,好多ifelse判断(因为想的时候没考虑到所有情况吧,提交了好多次,一直在打补丁- -),最后一次提交的时候心惊胆战的,怕时间打败了0.001%的人,结果提交的时候发现打败了92%的人,又惊又喜又吓的- -,但是算法在写法上感觉还是不太美好,好多冗余判断的感觉,有待继续提升。
优化了一下,每次左右指针移动不是移动到mid处,而是mid加减1处。如下:
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
len_nums = len(nums)
left = 0
right = len_nums-1
mid = (left+right)/2
while left<=right:
if nums[mid] == target:
return mid
elif nums[left] == target:
return left
elif nums[right] == target:
return right
elif nums[left]<nums[mid]:
if target>=nums[left] and target<=nums[mid]:
right = mid-1
mid = (left+right)/2
else:
left = mid+1
mid = (right+left)/2
elif target>=nums[mid] and target<=nums[right]:
left = mid+1
mid = (left+right)/2
else:
right = mid-1
mid = (right+left)/2
return -1
提交了两次,第一次是打败了19%,吓一跳,再提交一次就变成98%了,- -。。。