#java #arrays #vector #multidimensional-array #subset-sum
#java #массивы #вектор #многомерный массив #подмножество-сумма
Вопрос:
У меня есть этот код…это делает примерно то, что мне нужно. Он ищет в предопределенном массиве целых чисел два целых числа, которые суммируются с целевым значением int. Однако при вводе значений в вектор, вместо того, чтобы помещать их в ячейки, он помещает все значения вместе. т.Е. для int array[50,40,30,20,10] и target 50, а не возвращает [[50][40,10][30,20]… и т.д.], он печатает [[50,40,10,30,20 …и т.д.]] Как я могу это исправить?
public Vector<Vector<Integer>> subsetSum(int[] array, int target) {
//creates vectors, adds inner vector to another vector
outer = new Vector<Vector<Integer>>();
inner = new Vector<Integer>();
outer.add(inner);
for (int k = 0; k < array.length; k ) {
for (int l = 1; l < array.length; l ) {
int sum = array[k] array[l]; //sum of l and k
if (sum == target) {
//add l,k to vector
inner.add(array[l]);
inner.add(array[k]);
//prints l and k if their sum equals target
System.out.println(array[l] " " array[k] "=" target);
}
else {
System.out.print("");
}
}
//if k is the target, display
if (array[k] == target) {
//add k to vector
inner.add(array[k]);
//prints if int equals target
System.out.println(array[k] "=" target);
}
}
//return combinations that add up to target in vector form
return outer;
}
Ответ №1:
Вы добавляете только один вектор outer
. Разве это не так, что если вы найдете пару, которая в сумме составляет требуемую сумму, вы хотите, чтобы они были в отдельном векторе? Итак, вам нужно создать новый «внутренний» вектор, когда это произойдет, и добавить его outer
.
Удалите эти строки:
inner = new Vector<Integer>();
outer.add(inner);
Изменить:
if (sum == target) {
inner = new Vector<Integer>();
outer.add(inner)
//add l,k to vector
inner.add(array[l]);
inner.add(array[k]);
И:
if (array[k] == target) {
inner = new Vector<Integer>();
outer.add(inner)
//add k to vector
inner.add(array[k]);
Наконец, рассмотрите возможность создания inner
и outer
в локальные переменные.
Комментарии:
1. Можно также рассмотреть возможность использования
List
(объявленных типов) иArrayList
(сконструированных объектов) вместо старой школыVector
. Если вы создалиinner
иouter
локальные переменные, то можно было бы создатьstatic
и всю функцию.2. Спасибо! Исправлена проблема. Последующий вопрос (бонусные баллы?): Для того же примера 50,40,30,20,10, приведенного выше, программа показывает [40,10] в дополнение к [10,40]. Любая подсказка, как я мог бы это исправить? Спасибо.
3. Инициализируйте
l
k 1
вместо1
.
Ответ №2:
Я думаю, ваша ошибка заключается в том, что сначала добавьте векторное значение во внешнее, чтобы оно возвращало все значение только из внешнего вектора, а не во внутреннем векторе.. должны быть добавлены после проверки условия
if (array[k] == target) {
//add k to vector
inner.add(array[k]);
//prints if int equals target
System.out.println(array[k] "=" target);
}
outer.add(inner)
Ответ №3:
Переместите эти две строки:
inner = new Vector<Integer>();
outer.add(inner);
во внешний цикл (тот, у которого есть переменная index k
.)
Комментарии:
1. Это приведет к добавлению большого количества пустых «внутренних» векторов к внешнему вектору.
Ответ №4:
Кроме того, вы собираетесь иметь вектор векторов? потому что на данный момент у вас есть вектор с одним вектором с именем inner в нем, поэтому все добавляется прямо во inner . Вы не создаете новый вектор каждый раз, чтобы вставлять каждую пару.
Ответ №5:
Ответ Дипы находится на полпути, но вам также нужно будет создать новый экземпляр inner
внутри for
цикла, прежде чем добавлять в него значения; в противном случае вы получите все значения внутри одного inner
. Вот так:
final Vector<Integer> inner = new Vector<Integer>();
outer.add(inner);
Вы также можете continue
после добавления немного повысить производительность.