zoukankan      html  css  js  c++  java
  • 剑指 Offer 29. 顺时针打印矩阵

    剑指 Offer 29. 顺时针打印矩阵

    循环打印二维数组/矩阵的规律:

    从左向右打印,此时上边界向下移动,行不变,列++

    从上向下打印,此时右界向左移动,列不变,行++

    从右向左打印,此时下边界向上移动,行不变,列--

    从下向上打印,此时上左界向右移动,列不变,行--

    算法框架

    int t=0,b=m-1,l=0,r=n-1;
    while(true){
    	//从左向右打印,此时上边界向下移动,行不变,列++
        for(int i=l;i<=r;i++){
            num[top][i];
        }
        t++;
        if(t>b) break;
        
        //从上向下打印,此时右界向左移动,列不变,行++
        for(int i=t;i<=b;i++){
            num[i][r];
        }
        r--;
        if(l>r) break;
        
        //从右向左打印,此时下边界向上移动,行不变,列--
        for(int i=r;i>=l;i-){
            num[b][i];
        }
        b--;
        if(t>b) break;
        //从下向上打印,此时上左界向右移动,列不变,行--
        for(int i=b;i>=t;i--){
            num[i][l];
        }
        l++;
        if(l>r) break;
    }
    

    实现

    public int[] spiralOrder(int[][] matrix) {
        if(matrix.length == 0){
            return new int[]{};
        }   
        List<Integer> list = new ArrayList<>();
    
        int top = 0;
        int bottom = matrix.length-1;
        int left = 0;
        int right = matrix[0].length-1;
        while(true) {
            //从左向右打
            for(int i=left;i<=right;i++) {
                list.add(matrix[top][i]);
            }
            if(++top>bottom) {
                break;
            }
            //从上到下
            for(int i=top;i<=bottom;i++) {
                list.add(matrix[i][right]);
            }
            if(left>--right) {
                break;
            }
            //从右到左
            for(int i=right;i>=left;i--) {
                list.add(matrix[bottom][i]);
            }
            if(top>--bottom) {
                break;
            }
            //从下到上
            for(int i=bottom;i>=top;i--) {
                list.add(matrix[i][left]);
            }
            if(++left>right) {
                break;
            }
        }
        return list.stream().mapToInt(Integer::valueOf).toArray();
    }
    
  • 相关阅读:
    C++模板学习之优先队列实现
    static 和const分别怎么用,类里面static和const可以同时修饰成员函数吗?
    C和C++的区别
    C++多态例子_虚函数
    转:master公式(主方法)
    C++11最常用的新特性如下
    转:哈夫曼树详解
    linux shell脚本
    linux 正则表达式
    linux shell命令
  • 原文地址:https://www.cnblogs.com/zincredible/p/13322495.html
Copyright © 2011-2022 走看看