剑指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();
    }
发布了96 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41852212/article/details/101794895