673. 最长递增子序列的个数

文章介绍了如何使用Python中的bisect_left函数实现二分查找,解决找出数组的第K大和问题,即求最长递增子序列的长度。作者通过实例展示了如何在O(nlogn)的时间复杂度下,利用二分搜索的思想找到满足特定条件的索引。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

时间复杂度O(nlogn)解法,python更简便的二分写法,类似

2386. 找出数组的第 K 大和

当中 二分暴搜 的写法

class Solution:
    def findNumberOfLIS(self, nums: List[int]) -> int:
        
        d = []
        cnt = []

        for v in nums:
            
            i = bisect_left(range(len(d)), True, key = lambda x : d[x][-1] >= v)
            c = 1

            if i > 0:
                k = bisect_left(range(len(d[i-1])), True, key = lambda x : d[i-1][x] < v)
                c = cnt[i-1][-1] - cnt[i-1][k]
            
            if i == len(d):
                d.append([v])
                cnt.append([0,c])
            else:
                cnt[i].append(cnt[i][-1] + c)
                d[i].append(v)
        
        return cnt[-1][-1]

在python中,bisect_left进行二分查找时,返回的索引满足下列条件:

索引左边的元素(不包括索引对应的元素)均小于索引对应的元素,索引右边的元素(包括索引对应的元素)均大于等于索引对应的元素。所以bisect_left返回的索引能够根据你给的条件将有序数列进行分割。

在上述代码中,我希望找到这样一个分界线,在该索引左边 的元素都小于v,而从该索引开始向右的元素都不小于v。在代码的体现是,首先将key 定义的函数作用在数列中的所有元素中,找到最左侧的等于True的元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值