有兩個棧a和b。棧a中數據是無序,棧b無數據。現在需要把a中的數據移動到b,並且最後b是有序的(棧頂最小)。要求:空間複雜度爲O(1).
private static void fun(Stack<Integer> a, Stack<Integer> b) {
while (!a.isEmpty()){
Integer one = a.pop();//彈出待插入元素
if(b.isEmpty()){// b爲空則直接插入
b.push(one);
continue;
}
if(one<=b.peek()){ //b不爲空,如果插入元素比棧頂小則直接放入棧b
b.push(one);
continue;
}
int counter =0;//否則則查找這個元素再b中的位置,計數器。
while (!b.isEmpty()&&one>b.peek()){
a.push(b.pop());
counter++;
}
b.push(one);
for (int i = 0; i < counter; i++) {
b.push(a.pop());
}
}
}
說明:核心在空間複雜度爲O(1),因此也就先把所有數據放到數組,然後再數組中排序,在入棧到b。我們把a中的每個元素插入到b中,如果要維持b一直都是有序的,就要解決,a彈出一個元素,如果需要把這個元素插入到b中間。那麼就需要把b彈出一些元素。因此只能把這些元素存入a中,同時用一個計數器記錄個數。等元素插入後,再彈回來。