33
题目描述;
升序排列的整数数组 nums 在预先未知的某个点上进行了旋转(例如, [0,1,2,4,5,6,7] 经旋转后可能变为 [4,5,6,7,0,1,2] )。
请你在数组中搜索 target ,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
示例:
解答:
class Solution:
def search(self, nums: List[int], target: int) -> int:
'''
①
for i in range(len(nums)):
if nums[i]==target:
return i
return -1
②
if target in nums:
return nums.index(target)
else:
return -1
'''
if len(nums)==0:
return -1
left,right=0,len(nums)-1
while left<right:
mid=(left+right)//2
if nums[mid]<nums[right]: #[mid,right]部分有序
if nums[mid]<target<=nums[right]:
left=mid+1
else:
right=mid
else: #[1,mid]有序
if nums[left]<=target<=nums[mid]:
right=mid
else:
left=mid+1
if nums[left]!=target:
return -1
else:
return left
34
题目描述:
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
示例:
解答:
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
'''
try:
return [nums.index(target),len(nums)-nums[::-1].index(target)-1]
except ValueError:
return [-1,-1]
'''
a=bisect_left(nums,target) #左侧位置
b=bisect_right(nums,target)-1 #右侧的后一个位置
if b>=a:
return [a,b]
else:
return [-1,-1]
81
题目描述:
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。
编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。
示例:
解答:
class Solution:
def search(self, nums: List[int], target: int) -> bool:
'''
①
for i in range(len(nums)):
if nums[i]==target:
return True
return False
②
return target in nums
'''
n=len(nums)
left,right=0,n-1
while left<right:
if nums[left]==nums[left+1]:
left+=1
continue
elif nums[right-1]==nums[right]:
right-=1
continue
mid=(left+right)//2
if nums[left]<nums[mid]:
if nums[left]<=target<=nums[mid]:
right=mid
else:
left=mid+1
else:
if nums[mid+1]<=target<=nums[right]:
left=mid+1
else:
right=mid
return nums[left]==target
153
题目描述:
假设按照升序排序的数组在预先未知的某个点上进行了旋转。例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] 。
请找出其中最小的元素。
示例:
解答:
class Solution:
def findMin(self, nums: List[int]) -> int:
'''
return min(nums)
'''
if len(nums)<=1:
return nums[0]
if nums[-1]>=nums[0]:
return nums[0]
mid=(len(nums)-1)//2
if nums[mid]>=nums[0]:
return self.findMin(nums[mid+1:])
else:
return self.findMin(nums[:mid+1])
154
题目描述:
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
请找出其中最小的元素。
注意数组中可能存在重复的元素。
示例:
解答:
class Solution:
def findMin(self, nums: List[int]) -> int:
'''
return min(nums)
'''
if len(nums)==1:
return nums[0]
mid=(len(nums)-1)//2
if nums[mid]>nums[-1]:
return self.findMin(nums[mid+1:])
elif nums[mid]<nums[-1]:
return self.findMin(nums[:mid+1])
else:
if len(nums)>1:
nums.pop(mid)
return self.findMin(nums)