棧排序-O(1)空間複雜度(獵聘網)

有兩個棧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中,同時用一個計數器記錄個數。等元素插入後,再彈回來。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章