前几天看到一个算法题:有两个数组A,B,大小都为 n,数组元素的值任意,且无序,要求通过交换A和B中的元素,使得数组A中元素的和与数组B中元素的和之间的差最小。
我的想法就是:将两个数组合并为一个数组,并排序,然后再平分,每次取一头一尾两个,轮流放到A、B两个数组中。下面我把我的代码放上来
// 定义两个数组
NSMutableArray *array1 = [NSMutableArray arrayWithObjects:@5, @11, @32, @74, @36, nil];
NSMutableArray *array2 = [NSMutableArray arrayWithObjects:@26, @17, @8, @57, @10, nil];
// 定义一个BOOL值, 用来判断数组的奇偶, 如果为偶数,则为YES, 反之, 为NO
BOOL isEvenNumber = (array1.count % 2) ? NO : YES;
// 把两个数组整合到一起
NSMutableArray *array = [NSMutableArray arrayWithArray:array1];
[array addObjectsFromArray:array2];
// 对数组进行排序(这个方法返回的结果是从小到大)
NSArray *sortArray = [array sortedArrayUsingSelector:@selector(compare:)];
// 清空两个数组
[array1 removeAllObjects];
[array2 removeAllObjects];
分发数组元素
if (isEvenNumber) {
// 偶数
for (NSInteger i = 0; i<(sortArray.count / 2); i++) {
[array1 addObject:sortArray[i]];
[array1 addObject:sortArray[sortArray.count - i -1]];
[array2 addObject:sortArray[i + 1]];
[array2 addObject:sortArray[sortArray.count - i - 2]];
i++;
}
} else {
// 奇数
[array1 addObject:sortArray[sortArray.count / 2 - 1]];
[array2 addObject:sortArray[sortArray.count / 2]];
for (NSInteger i = 0; i<sortArray.count / 2 - 1; i++) {
[array1 addObject:sortArray[i]];
[array1 addObject:sortArray[sortArray.count - i - 1]];
[array2 addObject:sortArray[i + 1]];
[array2 addObject:sortArray[sortArray.count - i - 2]];
i++;
}
}
if 语句里面的内容也可以抽一个方法, 就不再演示了。