题目:
面试题 10.03. 搜索旋转数组
搜索旋转数组。给定一个排序后的数组,包含n个整数,但这个数组已被旋转过很多次了,次数不详。请编写代码找出数组中的某个元素,假设数组元素原先是按升序排列的。若有多个相同元素,返回索引值最小的一个。
示例1:
输入: arr = [15, 16, 19, 20, 25, 1, 3, 4, 5, 7, 10, 14], target = 5
输出: 8(元素5在该数组中的索引)
示例2:
输入:arr = [15, 16, 19, 20, 25, 1, 3, 4, 5, 7, 10, 14], target = 11
输出:-1 (没有找到)
这个题,因为有重复数字,所以因该想到从右边开始比。然后,旋转多次,其实就是旋转1次。然后,要找到左边界,所以需要加一条判断,就是如果 n u m s [ m i d ] = = n u m s [ l e f t ] nums[mid]==nums[left] nums[mid]==nums[left],这是很返回left,如果不等,则 l e f t + + left++ left++。其他的正常写。
ode:
class Solution:
def search(self, arr: List[int], target: int) -> int:
l = 0
r = len(arr)-1
while l<=r:
mid = l+(r-l)//2
if arr[l] == target:
return l
if arr[mid] == target: # 左边界
l += 1
continue
# 正常比较(和右边界比)
if arr[r] < arr[mid]:
if target >= arr[l] and target<arr[mid]:
r = mid-1
else:
l = mid+1
elif arr[r] > arr[mid]:
if target <= arr[r] and target > arr[mid]:
l = mid+1
else:
r = mid-1
else:
r -= 1
return -1
好了。