Итерация list2
, чтобы проверить, существует ли каждый элемент в list1
. Самый простой способ - использовать indexOf для выполнения операции проверки, он возвращает индекс первого вхождения указанного элемента в этом списке или -1, если этот список не содержит этот элемент. Каждая сложность времени проверки проверки равна O(n)
, поскольку в худшем случае она должна перебирать весь список.
В то время, если заказано list1
, мы можем использовать BinarySearch, чтобы улучшить производительность проверки до O(lgn)
.
Пример код здесь:
List<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
List<Integer> list2 = new ArrayList<>(Arrays.asList(1, 2, 5));
boolean contains = true;
int l2 = list2.size();
int currIndex = -1;
for(int j=0;j<l2;j++) {
int e2 = list2.get(j);
int i1 = list1.indexOf(e2);
if(i1 == -1) {
contains = false;
break;
}
if(i1 > currIndex) {
currIndex = i1;
}
}
System.out.println(contains);
время сложность O(n * m)
, что n
является 'размером s и m
является list2
' list1
s размера.
Но, самый эффективный способ не использовать indexOf способ сделать проверку. Так как требуется порядок вхождения, нет никакой необходимости итерации целого list1
в каждой операции проверки. Просто с последнего индекса контрольной точки, чтобы сделать проверку!
Пример кода здесь:
boolean contains = true;
int l1 = list1.size(), l2 = list2.size();
int currIndex = 0;
int i;
for(int j=0;j<l2;j++) {
int e2 = list2.get(j);
for(i=currIndex;i<l1;i++) {
if(e2 == list1.get(i)) {
break;
}
}
if(i == l1) {
contains = false;
break;
}
currIndex++;
}
System.out.println(contains);
Оба list1
и list2
повторяются только один раз, время сложность O(n + m)
.
Что вы получили до сих пор? Где у вас проблемы? Покажите нам какой-то код, чтобы мы могли вам помочь. – Turing85
@ Turing85: Я думаю, что OP просто хочет получить готовый метод от API - делать это вручную должно быть, по сути, тривиально. –
Что вы подразумеваете под порядком, допустимым подмножеством может быть '[1, 3, 5]'? – jbarrueta