题目:原题链接(中等)
标签:二分查找、数组
解法 | 时间复杂度 | 空间复杂度 | 执行用时 |
Ans 1 (Python) | O ( N ) | O ( 1 ) | 44ms (56.75%) |
Ans 2 (Python) | O ( N ) | O ( 1 ) | 40ms (78.90%) |
Ans 3 (Python) |
解法一(二分查找):
class Solution:
def search(self, arr: List[int], target: int) -> int:
size = len(arr)
# 二分查找旋转位置
aim = arr[0]
left, right = 0, size
while left < right:
mid = (left + right) // 2
if arr[mid] > aim:
left = mid + 1
elif arr[mid] < aim:
right = mid
# 处理重复值的问题
elif right - 1 > 0 and arr[right - 2] > arr[right - 1]:
left = right - 1
break
else:
right -= 1
move = left
# print("偏移量:", move)
# 二分查找目标值
ans = -1
left, right = 0, size
while left < right:
mid = (left + right) // 2
actual_mid = (mid + move) % size
# print(left, right, "->", mid, "->", actual, "=", arr[actual])
if arr[actual_mid] < target:
left = mid + 1
elif arr[actual_mid] > target:
right = mid
# 处理最终结果是针对实际坐标
else:
if ans == -1 or ans > actual_mid:
ans = actual_mid
actual_right = (right + move) % size
if arr[actual_right] == target:
if actual_right < actual_mid:
return 0
else:
right = mid
else:
right -= 1
return ans
解法二(折腾这么多,到底测试用例会不会奖励我):
class Solution:
def search(self, arr: List[int], target: int) -> int:
if target in arr:
return arr.index(target)
else:
return -1