各位大佬,我有个想法来实现这个题,就是滑动窗口去重加上滑动次数

注意!!!以下想法仅仅理论成立,代码部分有bug,具体bug是deque的溢出风险,因为pop了元素,所以后续访问必溢出,主包尝试改动,但能力有限,望周知

step1:去重(找每个数前N个数是否有一样的)

1,2,1(弹出),5,4,4(弹出),1

1,2,5,4,1(弹出两个数count=2)

for(int line = 0;line<M;line++)
    {
        int input;std::cin>>input;
        due.push_back(input);
        int step=std::max((int)line-N,0);
        int mark=0;
        for(int endWin=std::max(line-mark-1,0);endWin>step;endWin--)
        {
            if(due[line-mark]==due[endWin])
            {
                due.pop_back();
                mark++;
                count++;
                break;
            }
        }
    }

step2:计算滑动次数(窗口大小为“3”)

滑动3次count+3=5

count+=(due.size()>N? due.size()-N+1:due.size());

以下代码是主包正确AC解法

#include<iostream>
#include<deque>
#define NT std::endl

int main() {
	int N, M;
	std::cin >> N >> M;
	if (N == 0) {
		std::cout << 0;
		return 0;
	}
	std::deque<int>deq;
	int input, count = 1;
	std::cin >> input; M--; deq.push_back(input);
	while (M-- > 0){
		bool judge = false;
		std::cin >> input;
		for (int i = 0; i < deq.size(); i++) {
			if (deq[i] == input) {
				judge = true;
				break;
			}
		}
		if (judge == false) {
			if (deq.size() == N) {
				deq.pop_front();
				deq.push_back(input);
				count++;
			}
			else {
				deq.push_back(input);
				count++;
			}
		}
		judge = false;
	}
	std::cout << count;
}