栈排序-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中,同时用一个计数器记录个数。等元素插入后,再弹回来。

 

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