```python
###35. 搜索插入位置
#闭区间写法
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums)-1
while left <= right:
mid = (left + right) // 2
print(left,right,mid)
if nums[mid] < target:
left = mid + 1
else:
right = mid - 1
return left
#左闭右开
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums)
while left < right:
mid = (left + right) // 2
if nums[mid] < target:
left = mid+1
else:
right = mid
return right
#开区间
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
left, right = -1, len(nums)
while left+1 < right:
mid = (left + right) // 2
if nums[mid] < target:
left = mid
else:
right = mid
return right
```
```python
###74. 搜索二维矩阵
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
m,n = len(matrix),len(matrix[0])
i, j=0, n-1
while i != m-1 or j != 0:
cur = matrix[i][j]
if cur < target:
i+=1
if i > m-1:
return False
elif cur > target:
j-=1
if j < 0:
return False
else:
return True
return True if matrix[i][j]==target else False
##把整个矩阵看作一个数组
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
m, n = len(matrix), len(matrix[0])
left, right = 0, m * n
while left <= right:
mid = (left + right) // 2
x = matrix[mid // n][mid % n]
if x == target:
return True
if x < target:
left = mid+1
else:
right = mid-1
return False
```
```python
###34. 在排序数组中查找元素的第一个和最后一个位置
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
def bs(nums,target):
i,j = 0, len(nums)-1
while i <= j:
mid = i +(j-i)//2
if nums[mid] >=target:
j = mid-1
else:
i = mid+1
return i
a = bs(nums,target)
b = bs(nums,target+1)-1
print(a,b)
if a == len(nums) or nums[a] != target:
return [-1,-1]
return [a,b]34. 在排序数组中查找元素的第一个和最后一个位置
```
```python
###33.搜索旋转排序数组
class Solution:
def search(self, nums: List[int], target: int) -> int:
i,j = 0,len(nums)
while i < j:
mid = i+(j-i)//2
if nums[mid] == target:
return mid
if nums[i] < nums[mid]:
if nums[i] <= target and target < nums[mid]:
j = mid
else:
i = mid+1
else:
if nums[mid] < target and target <= nums[j-1]:
i = mid+1
else:
j = mid
return -1
```
```python
###153. 寻找旋转排序数组中的最小值
class Solution:
def findMin(self, nums: List[int]) -> int:
left, right = -1, len(nums) - 1 # 开区间 (-1, n-1)
while left + 1 < right: # 开区间不为空
mid = (left + right) // 2
if nums[mid] < nums[-1]:
right = mid
else:
left = mid
return nums[right]
##
class Solution:
def findMin(self, nums: List[int]) -> int:
left, right = 0, len(nums) - 1
mim = float('inf')
while left <= right: # 开区间不为空
mid = (left + right) // 2
if nums[mid] <= nums[right]:
mim = nums[mid]
right = mid-1
elif nums[mid] > nums[right]:
left = mid+1
return mim
```
每日刷题--二分法
于 2024-09-06 23:45:34 首次发布