怎么思考?

怎么才能得到最多的三带一?

这是个很容易误导人的词,最多,这会使得我们思考地更加复杂。

但其实,因为题目已经限制了长度为4,所以这里我们就不需要考虑复杂的问题,因为这里只能从头挨个找,找出来的就一定是最多的三带一。

下面开始解题:

明显地,我们需要对每个长度为4的连续区间作为单个窗口进行扫描,并且检查每个窗口内是否满足三带一的要求。

如果数组长度小于4,则没有三带一,直接输出0。

否则开始区间扫描:

显然,这里可以分出两种情况:

1.如果当前窗口满足三带一,那么更新下个窗口的时候就需要向后无覆盖位移,即不得和前面的窗口有交叉,位移4步。

2.如果当前窗口不满足三带一,那么更新下个窗口的时候就需要只向后位移一步,以避免漏统计。

代码部分我使用Counter来记录每个区间内的元素出现次数,且对每个长度区间切片。

from collections import Counter

n = int(input())
nums = list(map(int,input().split()))

if n < 4:
    print(0)
    exit()

cnt = 0
i = 0
while i + 4 <= n:
    window = nums[i:i+4]
    count_dic = Counter(window)
    if len(count_dic) == 2 and set(count_dic.values()) == {1,3}:
        cnt+=1
        i+=4
    else:
        i+=1
print(cnt)