双指针

似乎比较useless,暂时就浅尝辄止

概述

找到答案的单调性,把原来多重循环嵌套 \(O(n^2)\) 的枚举优化成双指针维护的 \(O(n)\) 枚举。

//暴力
for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) {
		todo;
    }

//双指针
for (int i = 0; j = 0; i < n; i++) {
	while(j < n && check(i, j)) j++;
}

寻找单词

//input
I am lyh

//output
I
am
lyh
int main() {
	char str[1000];
    gets(str);
    for (int i = 0; str[i]; i++) {
		int j = i;//i 为单词开头,j 为单词末尾
        while(j < n && str[j] != ' ') j++;
        for (int k = i; k < j; k++) cout << str[k];
        cout << endl;
        i = j;
    }
    return 0;
}

最长连续不重复子序列

//input
1 2 2 3 5

//output
3
int main() {
    cin >> n;
    for (int i = 0; i < n; i++) cin >> a[i];
    int res = 0;
    for (int i = 0, j = 0; i < n; i++) {
		cnt[a[i]]++;
        while(cnt[a[i]] > 1) {//直到j和i之间没有重复元素为止
			cnt[a[j]]--;
            j++;
        }
        res = max(res, i - j + 1);
    }
    cout << res << endl;
	return 0;
}
posted @ 2024-01-28 16:42  加固文明幻景  阅读(8)  评论(0编辑  收藏  举报