k个不同整数的子数组

2021-11-7-K个不同整数子数组

给定一个正整数数组 A,如果 A 的某个子数组中不同整数的个数恰好为 K,则称 A 的这个连续、不一定不同的子数组为好子数组。

(例如,[1,2,3,1,2] 中有 3 个不同的整数:1,2,以及 3。)

返回 A 中好子数组的数目。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/subarrays-with-k-different-integers 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路 set, 加2个for





def f(A, k):

    N = len(A)
    ans = 0

    for i in range(N+1):
        for j in range(i):
            a = tuple(A[x] for x in range(j,i))
            if len(set(a)) == k:
                ans += 1
    return ans


print(f([1,2,1,2,3], 2))
print(f([1,2,1,3,4],3))




超时



def f(A, k):
    import collections
    L1 = collections.defaultdict(int)
    L2 = collections.defaultdict(int)
    l1 = 0
    l2 = 0
    ans = 0
    total1 = 0
    total2 = 0
    for i,v in enumerate(A):
        if L1[v] == 0:
            total1 += 1
        L1[v] += 1


        while total1 > k:
            L1[A[l1]] -= 1
            if L1[A[l1]] == 0:
                total1 -= 1
            l1 += 1

        if L2[v] == 0:
            total2 += 1

        L2[v] += 1

        while total2 > k-1:
            L2[A[l2]] -= 1
            if L2[A[l2]] == 0:
                total2 -= 1
            l2 += 1

        ans += l2 - l1

    return ans


应该维持一个窗口

来了一个,就要收缩

wechatIMG15

Loading Disqus comments...
Table of Contents