unittest
{
	assert( [ "4", "3 1 3 2" ].parse.expand.solve == 1 );
	assert( [ "6", "105 119 105 119 105 119" ].parse.expand.solve == 0 );
	assert( [ "4", "1 1 1 1" ].parse.expand.solve == 2 );
	
	assert( [ "10", "1 1 1 1 1 1 3 2 3 4" ].parse.expand.solve == 5 );		// 追加ケース
}



import std.conv;
import std.range;
import std.stdio;
import std.string;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto n = input.front.strip.to!( long );
	input.popFront;
	auto vs = input.front.split.to!( long[] );
	return tuple( vs );
}

auto solve( long[] vs )
{
	// 偶数番目と奇数番目で分別
	long[ long ] es;
	long[ long ] os;
	foreach( i, v; vs )
	{
		if( i % 2 == 0 ) es[ v ] = es.get( v, 0 ) + 1;
		else             os[ v ] = os.get( v, 0 ) + 1;
	}
	
	// 偶数番目のうち、一番目と二番目に多い数を検索
	auto em1 = tuple( 0L, 0L );
	auto em2 = tuple( 0L, 0L );
	foreach( e; es.byPair )
	{
		if( em1[ 1 ] < e[ 1 ] )
		{
			em2 = em1;
			em1 = e;
		}
		else if( em2[ 1 ] < e[ 1 ] )
		{
			em2 = e;
		}
	}
	
	// 奇数番目のうち、一番目と二番目に多い数を検索
	auto om1 = tuple( 0L, 0L );
	auto om2 = tuple( 0L, 0L );
	foreach( o; os.byPair )
	{
		if( om1[ 1 ] < o[ 1 ] )
		{
			om2 = om1;
			om1 = o;
		}
		else if( om2[ 1 ] < o[ 1 ] )
		{
			om2 = o;
		}
	}
	
	// 偶数番目と奇数番目で一番目に多い数が同じだったら二番目に多い数を使う
	if( em1[ 0 ] == om1[ 0 ] )
	{
		if( em1[ 1 ] + om2[ 1 ] < em2[ 1 ] + om1[ 1 ] ) em1 = em2;
		else                                            om1 = om2;
	}
	
	// 書き換え対象の数を計算
	return vs.length - em1[ 1 ] - om1[ 1 ];
}
