1 二分查找(b)

33. Search in Rotated Sorted Array

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        start, end = 0, len(nums) - 1
        while start <= end:
            middle = start + (end - start) // 2
            print(middle)
            if nums[middle] == target:
                return middle
            if nums[middle] >= nums[start] :
                if target < nums[middle] and target >= nums[start]:
                    end = middle - 1
                else:
                    start = middle + 1
            if nums[middle] <= nums[end]:
                if target > nums[middle] and target <= nums[end]:
                    start = middle + 1
                else:
                    end = middle - 1
        return -1

81. Search in Rotated Sorted Array II

class Solution:
    def search(self, nums: List[int], target: int) -> bool:
        if len(nums) == 0: return False
        start, end = 0, len(nums) - 1
        while start + 1 < end:
            middle = start + (end - start) // 2
            if nums[middle] == target:
                return True
            if nums[start] == nums[middle]  and nums[end] == nums[middle]:
                start+=1
                end-=1
            elif nums[middle] >= nums[start]:
                if target >= nums[start] and target <= nums[middle]:
                    end = middle
                else:
                    start = middle
            else:
                if target >= nums[middle] and target <= nums[end]:
                    start = middle
                else:
                    end = middle
        if nums[start] == target: return True
        if nums[end] == target: return True
        return False

 153. Find Minimum in Rotated Sorted Array

class Solution:
    def findMin(self, nums: List[int]) -> int:
        if len(nums) == 0: return -1
        start, end = 0, len(nums) - 1
        while start + 1 < end:
            middle = start + (end - start) // 2
            if nums[middle] < nums[end]:
                end = middle
            else:
                start = middle + 1
        if nums[start] < nums[end]:
            return nums[start]
        else:
            return nums[end]

154. Find Minimum in Rotated Sorted Array II

class Solution:
    def findMin(self, nums: List[int]) -> int:
        if len(nums) == 0: return -1
        start, end = 0, len(nums) - 1
        while start + 1 < end:
            middle = start + (end - start) // 2
            if nums[middle] < nums[end]:
                end = middle
            elif nums[middle] > nums[end]:
                start = middle + 1
            else:
                end-=1
        if nums[start] < nums[end]:
            return nums[start]
        else:
            return nums[end]

300. Longest Increasing Subsequence

class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        tails = [0] * len(nums)
        size = 0
        for num in nums:
            i, j = 0, size
            while i != j:
                middle = (i + j) // 2
                if tails[middle] < num:
                    i = middle + 1
                else:
                    j = middle
            tails[i] = num
            size = max(i + 1, size)
        return size

410. Split Array Largest Sum

class Solution:
    def splitArray(self, nums: List[int], m: int) -> int:
        left, right = max(nums), sum(nums)
        while left < right:
            middle = (left+right) // 2
            total, count = 0, 1
            for num in nums:
                if total + num <= middle: 
                    total += num
                else:
                    total = num
                    count += 1
            if count > m: left = middle + 1
            else: right = middle
        return right

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值