<第3節-ダブルポインタ、スライドウィンドウ>2.公共の要素を求めます


2.共通要素の取得
<説明>
A、Bの2つのセットが与えられた場合、2つのセットの共通要素が抽出され、昇順に出力されるプロセス
グラフに記入してください.
<入力>
第1行は、集合AのサイズN(1<=N<=30000)を与える.
2行目にはN個の要素があります.要素は重複しません.
3行目は、集合BのサイズM(1<=M<=30000)を与える.
4行目にはM要素があります.要素は重複しません.
各集合の要素の自然数は10000000を超えない.
<出力>
2つのセットの共通要素を昇順に並べて出力します.
===================================================
<コード>
並べ替え順は昇順ではないので、まず昇順で並べ替えます.共通要素を求めるので、2つの配列のうちの1つが終わります.同じ要素がある場合、arraylistに追加すると、2つの配列位置を指すp 1とp 2が増加します.そうでなければ、より小さな値を持つ配列の位置値が増加します.
import java.util.*;

class Main {	
	public ArrayList<Integer> solution(int num,int num2,int[] array1,int[] array2){
		ArrayList<Integer> answer=new ArrayList<>();
		int p1=0,p2=0;
		Arrays.sort(array1);
		Arrays.sort(array2);
		
		while(p1<num&&p2<num2) {
			if(array1[p1]==array2[p2]) {answer.add(array1[p1++]); p2++;}
			else if(array1[p1]<array2[p2]) p1++;
			else p2++; }
		
		return answer;
		
	}
		
		
	public static void main(String[] args) {
		Main main = new Main();
		Scanner scan = new Scanner(System.in);
	   
		int num=scan.nextInt();
	    int[] array1=new int[num];
		for(int i=0;i<num;i++) {
			array1[i]=scan.nextInt();
			}
		
	    int num2=scan.nextInt();
		int[] array2=new int[num2];
		for(int i=0;i<num2;i++) {
			array2[i]=scan.nextInt();
			}
		
		for(int x: main.solution(num,num2,array1,array2)) {
		System.out.print(x+" ");}
		}
}
<重要>
1) Arrays.sort(配列名)
  • 配列は昇順に配列されている.