54. 螺旋矩阵(中等题)

题目描述:
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

示例 1:

输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]

示例 2:

输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/spiral-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法:

class Solution {
    List<Integer> list = new ArrayList<>();
    public List<Integer> spiralOrder(int[][] matrix) {
        if(matrix == null||matrix.length == 0 || matrix[0].length == 0){
            return list;
        }
        int tr = 0;
        int tc = 0;
        int dr = matrix.length-1;
        int dc = matrix[0].length-1;
        while (tr<=dr && tc<=dc){
            help(matrix,tr++,tc++,dr--,dc--);
        }
        return list;
    }

    private void help(int[][] matrix,int tr,int tc,int dr,int dc) {
        if(tr == dr){//如果只剩一行了
            for (int i = tc; i <= dc; i++) {
                list.add(matrix[tr][i]);
            }
        }else if(tc == dc){//如果只剩一列了
            for (int i = tr; i <= dr; i++) {
                list.add(matrix[i][tc]);
            }
        }else {
            int cur_r = tr;
            int cur_c = tc;
            while (cur_c != dc){//列下标加到右边界
                list.add(matrix[cur_r][cur_c]);
                cur_c++;
            }
            while (cur_r !=dr){//行下标加到下边界
                list.add(matrix[cur_r][cur_c]);
                cur_r++;
            }
            while (cur_c != tc){//列下标减到左边界
                list.add(matrix[cur_r][cur_c]);
                cur_c--;
            }
            while (cur_r != tr){//行下标减到上边界
                list.add(matrix[cur_r][cur_c]);
                cur_r--;
            }
        }
    }
}
发布了258 篇原创文章 · 获赞 5 · 访问量 5330

猜你喜欢

转载自blog.csdn.net/weixin_43105156/article/details/104474425