时间复杂度O(nlogn)解法,python更简便的二分写法,类似
当中 二分暴搜 的写法
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的元素。