# Sorting# Two Pointers# Array

d478 - 共同的數 - 簡易版

🔗 前往 ZeroJudge 原題

題目描述

題目要求計算兩個已排序的正整數陣列的共同元素數量。輸入包含多組測試案例,每組案例包含兩個陣列,分別代表小潘和小花擁有的數字。

解題思路

對於每組測試案例,首先將兩個陣列合併,並移除不屬於兩個陣列的元素。然後,對合併後的陣列進行排序。最後,使用雙指標方法計算排序後陣列中相鄰元素相等的次數,即為共同元素的數量。

複雜度分析

  • 時間複雜度: O(n * m * log(m)),其中 n 是測試案例的數量,m 是陣列的大小。主要時間花在排序上。
  • 空間複雜度: O(m),主要用於儲存合併後的陣列。

程式碼

#include <iostream>
#include <algorithm>
using namespace std;
int main(){
	ios::sync_with_stdio(false);
    cin.tie(NULL);
	int a,b,ans,i,k,mina,minb,maxa,maxb,ba,bas;
	cin >> a >> b;
	b*=2;
	ba=b;
	for(;a>0;a--){
		b=ba;
		int c[b];
		for(i=0;i<b;i++)
			cin >> c[i];
		mina=c[0];
		minb=c[b/2];
		maxa=c[b/2-1];
		maxb=c[b-1];	
		for(i=0,bas=0;i<b;i++){
			if((c[i]<mina||c[i]<minb)||(c[i]>maxa||c[i]>maxb)){
				bas++;
				c[i]=-1;
			}
		}
		b-=bas;
		int d[b];
		for(i=0,k=0;i<ba;i++){
			if(c[i]!=-1){
				d[k]=c[i];
				k++;
			}
		}
		sort(d,d+b);
		for(i=0,ans=0;i<b-1;i++){
			if(d[i]==d[i+1]){ 
				ans++;
				i++;
			} 
		}
		cout << ans << endl;
	}
}

Discussion