您的位置:首页 > 编程语言 > Python开发

leet33. 搜索旋转排序数组

2018-03-30 22:59 435 查看
题目:

假设按照升序排序的数组在预先未知的某个关键点上旋转。
(即
0 1 2 4 5 6 7
 将变成
4 5 6 7 0 1 2
)。
给你一个目标值来搜索,如果数组中存在这个数则返回它的索引,否则返回 -1。
你可以假设数组中不存在重复。
分析:
可以直接用库函数index(),时间复杂度O(n);
旋转的后果是列表不再是递增列表,但列表依然有序,可以通过分情况讨论采用二分法,时间复杂度O(lgn)

代码:class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
if not nums:
return -1
l = 0
r = len(nums) - 1
while l < r:
if r - l == 1:
if target in nums:
return nums.index(target)
else:
return -1
mid = (l + r) // 2
# print "l:%d,mid:%d,r:%d"%(l,mid,r)
if nums[mid] == target:
return mid
if target > nums[mid]:
if nums[r] < nums[mid]:
l = mid + 1
else:
if target > nums[r]:
r = mid -1
else:
l = mid + 1
else:
if nums[mid] > nums[l]:
if target < nums[l]:
l = mid + 1
else:
r = mid -1
else:
r = mid - 1
# print 'r:%d' % r
if nums[r] == target:
return r

return -1
思考:
考虑特殊情况,列表长度为2的情况,直接采用遍历的方法,或使用index()库函数
代码优于leetcode中97%的case
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息