每日刷题--二分法



```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
```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值