Я очень сомневаюсь, что время O (n) и O (1) возможно с массивом . Некоторые предлагают связанный список, но вам понадобится пользовательский связанный список, где у вас есть прямой доступ к узлам, чтобы сделать это, т.е. встроенные в язык связанные списки не будут работать.
Вот моя идея, используя custom вдвойне связанный список , который удовлетворяет ограниченным сложностям, используя в качестве примера [1, 7, -5, 9, -12, 15]:
Прокрутите список , если видите негатив, обрежьте его и добавьте к концу негативов спереди. Каждая операция равна O (1), поэтому общее время равно O (n). Операции со связанным списком выполняются на месте, поэтому O (1) пробел.
Подробно:
last_negative_node = null;
at -5:
cut off -5 by setting 7.next = 9,
then add -5 to front by -5.next = 1,
then update last_negative_node = 5 // O(1), the linked list is now [-5, 1, 7, 9, -12, 15]
at -12:
cut off -12 by setting 9.next = 15,
then add -12 to front by -12.next = last_negative_node.next,
then update last_negative_node.next = -12,
then update last_negative_node = -12 //O(1), the linked list is now [-5, -12, 1, 7, 9, 15]
no more negatives so done.