leet33. 搜索旋转排序数组
2018-03-30 22:59
435 查看
题目:
假设按照升序排序的数组在预先未知的某个关键点上旋转。
(即
给你一个目标值来搜索,如果数组中存在这个数则返回它的索引,否则返回 -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
假设按照升序排序的数组在预先未知的某个关键点上旋转。
(即
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
相关文章推荐
- 搜索旋转排序数组 II
- lintcode-62-搜索旋转排序数组
- LeetCode——旋转排序数组搜索
- 搜索旋转排序数组 II
- Java实现-搜索旋转排序数组2
- 搜索旋转排序数组
- LintCode-搜索旋转排序数组
- 搜索旋转排序数组 II
- 搜索旋转排序数组I
- 搜索旋转的排序数组
- LintCode 62 搜索旋转排序数组
- 在旋转排序数组中搜索
- 搜索旋转排序数组 查看运行结果 ——LintCode
- 搜索旋转排序数组
- lintcode-搜索旋转排序数组II-63
- LintCode:M-搜索旋转排序数组
- LintCode_63_搜索旋转排序数组 II
- 62 - 搜索旋转排序数组
- LintCode-搜索旋转排序数组 II
- [Lintcode] Search in Rotated Sorted Array II 搜索旋转排序数组 II