【发布时间】:2015-09-11 04:10:06
【问题描述】:
有 N 个男孩和 N 个女孩。只有一个男孩和一个女孩可以组成一个舞蹈对(即不允许同性舞蹈对)。成对的唯一其他条件是它们的绝对高度差应小于或等于 K。
找出可以组成的最大配对数,以便每个人都有一个独特的伙伴。
输入格式 第一行将包含两个整数 N 和 K。 第二行将包含 N 个整数,即 N 个男孩的身高。 第三行将包含 N 个整数,即 N 个女孩的身高。
约束 1≤N≤105 1≤K≤109 1≤男孩或女孩身高≤109
输出格式 包含最大可能对数的单行。
我的问题是在满足条件后从两个数组中删除元素。 (存储2个数组后)
我使用的第一个算法:
Arrays.sort(ArrBoys);
Arrays.sort(ArrGirls);
double count = 0;
for (int i = 0; i < ArrGirls.length; i++) {
for (int j = 0; j < ArrBoys.length; j++) {
if ((int) Math.abs(ArrBoys[j] - ArrGirls[i]) <= k) {
ArrBoys[j] = 0;
ArrGirls[i] = 0;
count++;
break;
}
}
}
System.out.println((int) count);
这绝对是错误的,因为我们需要删除那些元素而不是使它们为零,所以我意识到我需要将它们转换为 ArrayLists。 然后我得到了这段代码:
double count = 0;
int dif = 0;
for (Integer ArrGirl : ArrGirls) {
loop1:
{
for (Integer ArrBoy : ArrBoys) {
dif = (int) Math.abs(ArrBoy - ArrGirl);
if (dif <= k) {
System.out.println("we took " + ArrBoy + " from boys with "
+ ArrGirl + " from girls, thier dif is " + dif);
ArrBoys.remove(ArrBoy);
ArrGirls.remove(ArrGirl);
count++;
break loop1;
}
}
}
}
System.out.println((int) count);
使用这个算法给了我一个这样的例外:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
在我搜索了这个异常之后,我发现我应该在使用 remove 方法时使用 Iterator,然后我使用了这段代码:
double count = 0;
int dif = 0;
Iterator<Integer> iteB = ArrGirls.iterator();
Iterator<Integer> iteG = ArrGirls.iterator();
while (iteG.hasNext()) {
int value2 = iteG.next();
while (iteB.hasNext()) {
int value = iteB.next();
dif = (int) Math.abs(value - value2);
if (dif <= k) {
System.out.println("we took " + value + " from boys with " + value2
+ " from girls, thier dif is " + dif);
count++;
iteB.remove();
iteG.remove();
}
}
}
System.out.println((int) count);
这段代码给了我错误的信息,也给了我同样的异常。
这是我第一次使用ArrayList,您有什么想法可以更正这段代码吗?
【问题讨论】:
-
例如可以使用bipartite graph matching解决。
-
您需要在删除后中断(或更改您的逻辑),您不能在调用 next() 之前调用 remove
标签: java arrays algorithm arraylist iterator