劍指Offer(13)順時針打印矩陣 包含min的棧

劍指Offer(13)順時針打印矩陣 包含min的棧

題目:

輸入一個矩陣,按照從外向裏以順時針的順序依次打印出每一個數字,例如,如果輸入如下4 X 4矩陣:

1 2 3 4

5 6 7 8

9 10 11 12

13 14 15 16

則依次打印出數字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

思路:

12

34 輸出爲 1243

對於任意一個矩陣,可以找到他的位於正對角線兩邊界的元素,

1234

5678

4329 對於這個矩陣 第一個邊界元素是1 ,第二個邊界元素是9。

假設 1 的座標爲 (row1,cow1)

假設 9 的座標爲 (row2,cow2)

對於任意一個矩陣,都可以

從 cow1++到 cow2 其中row不變 輸出每個元素 第一行

然後 row1 ++ 到 row2 其中cow不變 輸出每個元素 最後一列

然後 cow2-- 到cow1 其中row不變 輸出每個元素 最後一行

row2-- 到row1 其中cow不變 輸出每個元素。 第一列

當完成一次循環時,(row1++,colw1++) 如果此時沒有出現 row1>=row2 則繼續上面的函數輸出。

代碼:

    ArrayList arrayList = new ArrayList();
    public ArrayList<Integer> printMatrix(int[][] matrix)
    {
        int row1 = 0;
        int  cow1= 0;
        int row2 = matrix.length - 1;
        int  cow2= matrix[0].length - 1;
        while (cow1 <= cow2 && row1 <= row2) {
            printEdge1(matrix, row1++, cow1++, row2--, cow2--);
        }
        return arrayList;
    }
    public  void printEdge1(int[][] m, int row1, int cow1, int row2, int cow2)
    {
        if(row1==row2)
        {
            for (int i = cow1; i <= cow2; i++)
            {
                arrayList.add(m[row1][i]);
                //只有一行, 遍歷每列
            }
        }
        else if (cow1==cow2)
        {
            for (int i = row1; i <= row2; i++)
            {
                arrayList.add(m[i][cow1]);
                //只有一列  遍歷每行
            }
        }
        else
        {
            int c=cow1;
            int r=row1;
            while(c!=cow2)
            {
                arrayList.add(m[row1][c]);
                // 左到右
                c++;
            }
            while(r!=row2)
            {
                arrayList.add(m[r][cow2]);
                //上到下
                r++;
            }
            while(c!=cow1)
            {
                arrayList.add(m[row2][c]);
                // 右到左
                c--;
            }
            while(r!=row1)
            {
                arrayList.add(m[r][cow1]);
                // 下到上
                r--;
            }
        }
    }

題目:

定義棧的數據結構,請在該類型中實現一個能夠得到棧中所含最小元素的min函數(時間複雜度應爲O(1)。

思路:

要求如果當前最小元素的棧被彈出了,如何得到下一個最小的元素呢?

處理方法是建立一個輔助棧,每次入棧前將當前元素a與輔助棧裏的頂部元素b比較,如果a>b,則入棧一個b,反之入棧a.

代碼:

    private Stack<Integer> dataStack=new Stack<>();
    private Stack<Integer> helpStack=new Stack<>();
    public void push(int node) {
        dataStack.push(node);
        if (helpStack.isEmpty())
            helpStack.push(node);
        else
            helpStack.push(Math.min(node,helpStack.peek()));
    }
    public void pop() {
        dataStack.pop();
        helpStack.pop();
    }
    public int top() {
        return dataStack.peek();
    }
    public int min() {
        return helpStack.peek();
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章