[编程题] lk [剑指 Offer 29. 顺时针打印矩阵]

[编程题] lk 剑指 Offer 29. 顺时针打印矩阵

题目信息

image-20200802233748625

思路

定义上下左右边界,循环打印

注意

如何返回一个空的数组的问题。借助stream把list转一下。

Java代码

import java.util.*;
import java.util.stream.*;
class Solution {
    public int[] spiralOrder(int[][] matrix) {
        //解决无法传入空数组的情况
        if(matrix==null || matrix.length==0)  {return new ArrayList<Integer>().stream().mapToInt(Integer::intValue).toArray();}
        //定义边界
        int left = 0;
        int right = matrix[0].length-1;
        int up = 0;
        int down = matrix.length-1;
        
        int[] res = new int[(right+1)*(down+1)];
        int index=0;
        while(true){
            //右
            for(int i=left;i<=right;i++){
                res[index++] = matrix[up][i];
            }
            if(++up > down) break;
            
            //下
            for(int i=up;i<=down;i++){
                res[index++] = matrix[i][right];
            }
            if(--right<left) break;
            
            //左
            for(int i=right;i>=left;i--){
                res[index++] = matrix[down][i];
            }
            if(--down < up) {break;}
            
            //上
            for(int i=down;i>=up;i--){
                res[index++] = matrix[i][left];
            }
            if(++left>right)  break;
        }
        
        //上边定义为数组了,把数组转为List返回(牛客的输出)
        //return (ArrayList<Integer>)Arrays.stream(res).boxed().collect(Collectors.toList());
        return res;
    }
}
posted @ 2020-08-02 23:40  北鼻coder  阅读(172)  评论(0编辑  收藏  举报