我觉得解题的关键条件是: 任意两个j%i(求余)为偶数(i,j,i
我从这句话得到的信息是,每一组数都是同奇偶性的数(全偶数、全奇数)!
所以我的思路是,将N长度的无重复数的数组拆分为两个集合!判断两个集合中数字和较大的一组则为正解!
以下是我的java代码,若有不合理的欢迎纠正!
public class Test09 {
/**
* @param args
*/
public static void main( String args[] ) {
int nums[] = { 2 , 6 , 8 , 12 , 56 , 9 , 32 , 47 , 5 , 16 }; // 例子 有n个无重复数的数组
int len = nums.length;
List< Integer > oddList = new ArrayList< Integer >();
List< Integer > evenList = new ArrayList< Integer >();
for ( int i = 0 ; i < len ; i++ ) { // 将n个数按奇偶性查分
if ( isEven( nums[ i ] ) ) {
evenList.add( nums[ i ] ); // 偶数聚集地
} else {
oddList.add( nums[ i ] ); // 奇数聚集地
}
}
List< Integer > bigList = isBig( group( oddList , len ) , group( evenList , len ) );
System.out.println( bigList );
}
/**
* 获取两个集合中总和较大的一组
*
* @param oddList
* @param evenList
* @return
*/
public static List< Integer > isBig( List< Integer > oddList , List< Integer > evenList ) {
return sum( oddList ) > sum( evenList ) ? oddList : evenList;
}
/**
* 得到有效集合
*
* @param list
* @param len
* @return
*/
public static List< Integer > group( List< Integer > list , int len ) {
if ( list.size() < len / 2 ) { // 集合的个数必须为 < n/2
return list;
} else {
Collections.sort( list );
int size = list.size();
// 当集合长度大于 n/2 时删除集合中较小的
for ( int i = size - len / 2 ; i > 0 ; i-- ) {
list.remove( i - 1 );
}
return list;
}
}
private static int sum( List< Integer > list ) {
int count = 0;
for ( Integer integer : list ) {
count += integer;
}
return count;
}
// 判断一个数是否为偶数
private static boolean isEven( int x ) {
return ( x & 1 ) == 0;
}
}