Acwing_799(最长连续不重复子序列)

本文介绍了如何使用双指针算法在O(n)时间内解决最长连续不重复子序列问题,通过对比暴力求解和双指针策略,展示了双指针在数组中的应用,如快慢指针、左右指针等,以及其在实际编程中的代码实现。
摘要由CSDN通过智能技术生成

原题链接:

799. 最长连续不重复子序列 - AcWing题库

题解:

本题如果采用暴力求解会T,因此最好采用双指针算法在O(n)内求解。

思路:首先定义一个指针i,然后定义一个指针j,以i为区间的右端点,来寻求以j为区间左端点的最大不重复子区间。用数组S记录元素的个数来判断有无重复,当无重复时,j不动,i一直向右;当有重复时,i不动,j向右直到区间内无重复元素为止。

双指针参考模板:

常用代码模板1——基础算法 - AcWing

双指针算法的精髓在于通过使用两个指针来协同工作,从而在一次遍历中解决问题。这种技术通常用于数组或链表等数据结构,具体的应用有多种形式。

以下是一些双指针算法的常见应用:

  1. 快慢指针: 通过设置两个指针,一个移动速度较快,另一个移动速度较慢,可以解决环的检测、链表中点的查找等问题。

  2. 左右指针: 在数组中,设置两个指针分别指向数组的两端,根据问题的特性,通过移动指针来解决问题,比如两数之和、三数之和等。

  3. 滑动窗口: 通过维护一个窗口,通常是一个区间或子数组,通过两个指针移动来调整窗口,解决一些子数组或子字符串的最优问题。

  4. 对撞指针: 在有序数组中,通过设置两个指针从数组两端开始,根据问题的性质,移动指针来寻找目标。

这些技术的共同点在于通过设置两个指针,根据问题的特性,通过协同工作的方式达到解决问题的目的。这种方法通常可以在 O(n) 的时间复杂度内解决问题,而不需要嵌套遍历。在实际应用中,双指针算法可以提高代码的效率和简洁性。

代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N], s[N];
int n;

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++) {
		s[a[i]]++;
		while (s[a[i]] > 1) {
			s[a[j]]--;
			j++;
		}
		res = max(res, i - j + 1);
	}
	cout << res;
}

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值