欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

0-9的整数数组,找一个尽量长的连续子序列,使得该子序列中没有相同的元素

程序员文章站 2024-02-03 16:54:40
...

问题:0-9的整数数组,找一个尽量长的连续子序列,使得该子序列中没有相同的元素

分析:利用滑动窗口的想法,遇到不重复的元素,窗口结尾往后走。遇到重复的,判断该子序列长度count与到目前为止最大长度max的大小,调整窗口,记录最大序列起止位置i和j,继续进行,直到末尾。


//唯一的雪花 找一个尽量长的连续子序列,该序列中没有相同的元素 (0-9)
int isIn(int arr[], int start, int end){
	for(int i=start; i<end; i++){
		if(arr[i] == arr[end]){
			printf(" %d",arr[i]);
			return 1;
		}
	} 
	return 0;
} 
void q1(int arr[], int n){
	int last[10]; //last是指该元素上一次出现的位置
	int start=0, end=0, sign = 0;
	int max = 0, count = 0, i,j; 
	for(; end<n; end++){
			if(end == n-1){ //判断是否到结尾 
				sign = 1;
			}
			printf("strart:%d,end:%d\n",start,end);
			if(!isIn(arr, start, end) && sign == 0){ // 如果end位置处的元素没有重复
				last[arr[end]] = end;
				count += 1;
			}else{
				if(max < count){
					i = start;
					j = end-1;
					max = count;
					printf("i:%d,j:%d\n",i,j);
				}
				start = last[arr[end]]+1; 
				count = end - start+1; //不能简单地把count赋值为0 
				last[arr[end]] = end;
			}
	}
	//输出
	for(; i<=j; i++){
		printf("%d\n",arr[i]);
	} 
}
 
int main(){
	int arr[] = {1,3,4,2,5,2,3,1,2,3,1,3,2,1,5,6,7,8,9};
	q1(arr ,19);
	getchar();
	return 0; 
} 

 

相关标签: C语言 算法