今日题目(剑指Offer系列)
剑指 Offer 29. 顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例:
示例 1: 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 示例 2: 输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出:[1,2,3,4,8,12,11,10,9,5,6,7]
解题思路:
>该题的意思就是将数组螺旋打印 >Java解法就是设立四个边界,然后根据四个边界定四个循环 >直到边界相等,说明所有元素已全部打印完成 >Python解法就会很简单 >Python有切片功能,可以很容易切出第一行的元素 >所以想法就是切出第一行的元素,然后将矩阵逆转90度 >不断循环该过程 >将矩阵逆转90度可以使用list(zip(*matrix))[::-1]
Python解法:
class Solution: def spiralOrder(self, matrix: List[List[int]]) -> List[int]: res=[] while matrix: res+=matrix.pop(0) matrix=list(zip(*matrix))[::-1] return res
Java解法:
if (matrix.length == 0) { return new int[] {}; } int left = 0; int right = matrix[0].length; int up = 0; int down = matrix.length; int[] res = new int[matrix[0].length * matrix.length]; int k = 0; while (true) { for (int i = left; i < right; i++) { res[k++] = matrix[up][i]; } if (++up >= down) break; for (int i = up; i < down; i++) { res[k++] = matrix[i][right - 1]; } if (--right <= left) break; for (int i = right - 1; i >= left; i--) { res[k++] = matrix[down - 1][i]; } if (--down <= up) break; for (int i = down - 1; i >= up; i--) { res[k++] = matrix[i][left]; } if (++left >= right) break; } return res;