📅  最后修改于: 2023-12-03 14:47:52.587000             🧑  作者: Mango
TCS CodeVita是印度最大的技术挑战赛,目的是通过解决现实生活中的难题来提升学生的技术能力。2019年TCS CodeVita面试相信是众多学生都期待的,下面我们来介绍一下面试的流程以及注意事项。
这是一道经典的动态规划问题:
题目描述:
给定一个长度为n的序列P,定义P[i] = x 的权值为P中最左边的值为x的连续段的长度。例如序列1 2 3 2 5的权值为(1,1,1,2,1)。现在你需要选出一个区间,使得该区间内每种值都恰好出现一次,请求出最短的区间长度。
例如,序列1 2 1 3 2 5,选择区间[2,4],则区间内各元素分别为2,1,3,包含了P的所有值,且区间长度最小,为3.
题目有点长,接下来贴出C++的代码片段。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
int n,a[100005],mn,mx,pos[100005],fi[100005],nxt[100005],l,r,ans=1e9;
// fi, nxt数组初始化为-1
bool vis[100005],tag[100005];
int main()
{
memset(nxt,-1,sizeof(nxt));
memset(fi,-1,sizeof(fi));
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]),mn=min(mn,a[i]),mx=max(mx,a[i]);
for (int i=1;i<=n;i++)
{
pos[a[i]]=i;
if (fi[a[i]]==-1) fi[a[i]]=i;
else nxt[pos[a[i]]]=i;
}
for (int i=1;i<=n;i++)
{
memset(tag,0,sizeof(tag));
int j,now=1;
for (j=i;j<=n&&j-i<ans-now+1&&now<mx-mn+1;j++)
if (!vis[a[j]]) vis[a[j]]=1,tag[a[j]]=1,now++; else break;
if (now==mx-mn+1) ans=min(ans,j-i),j--;
else if (j>n) break;
if (nxt[j]!=-1) i=nxt[j]-1; else break;
for (j=i+1;j<=n&&j-i<ans-now+1&&own<mx-mn+1;j++)
if (!tag[a[j]]) vis[a[j]]=1, now++; //比上面代码稍加修改,删去了第一条if语句
i=j-1;
}
printf("%d\n",ans);
return 0;
}
以上就是TCS CodeVita面试的介绍,希望对大家有所帮助!