33. 搜索旋转排序数组
原想法
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
n = len(nums)
for i in range(n):
if nums[i] == target:
return i
return -1
思路:
综上,时间复杂度O(n),空间复杂度是O(1)。虽然也过了,不过应该用二分搜索。
正确思路
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
n = len(nums)
if n == 0:
return -1
l, r = 0, n - 1
while l <= r:
mid = (l+r)/2
if nums[mid] == target:
return mid
if nums[0] <= nums[mid]:
if nums[0] <= target < nums[mid]:
r = mid - 1
else:
l = mid + 1
else:
if nums[mid] < target <= nums[n-1]:
l = mid + 1
else:
r = mid - 1
return -1
思路:
有序数组的查找使用二分搜索。
综上,时间复杂度O(logn),空间复杂度是O(1)。
注意点:
噗,提交的时候居然是原思路速度更快,迷。