前言:
今天朋友们对“螺旋矩阵java实现”大体比较着重,大家都想要学习一些“螺旋矩阵java实现”的相关知识。那么小编在网摘上网罗了一些有关“螺旋矩阵java实现””的相关文章,希望咱们能喜欢,兄弟们一起来学习一下吧!题目
在 R 行 C 列的矩阵上,我们从 (r0, c0) 面朝东面开始
这里,网格的西北角位于第一行第一列,网格的东南角位于最后一行最后一列。
现在,我们以顺时针按螺旋状行走,访问此网格中的每个位置。
每当我们移动到网格的边界之外时,我们会继续在网格之外行走(但稍后可能会返回到网格边界)。
最终,我们到过网格的所有 R * C 个空间。
按照访问顺序返回表示网格位置的坐标列表。
示例 1:输入:R = 1, C = 4, r0 = 0, c0 = 0 输出:[[0,0],[0,1],[0,2],[0,3]]
示例 2:输入:R = 5, C = 6, r0 = 1, c0 = 4 输出:[[1,4],[1,5],[2,5],[2,4],[2,3],[1,3],[0,3],[0,4],
[0,5],[3,5],[3,4],[3,3],[3,2],[2,2],[1,2],[0,2],[4,5],
[4,4],[4,3],[4,2],[4,1],[3,1],[2,1],[1,1],[0,1],[4,0],[3,0],[2,0],[1,0],[0,0]]
提示:1 <= R <= 100
1 <= C <= 100
0 <= r0 < R
0 <= c0 < C
解题思路分析
1、遍历;时间复杂度O(n^2),空间复杂度O(n^2)
// 顺时针:上右下左// 本题:右、下、左、上var dx = []int{0, 1, 0, -1}var dy = []int{1, 0, -1, 0}func spiralMatrixIII(rows int, cols int, rStart int, cStart int) [][]int { res := make([][]int, 0) total := rows * cols x, y := rStart, cStart res = append(res, []int{x, y}) index := 1 if total == 1 { return res } for k := 1; k < 2*(rows+cols); k = k + 2 { for i := 0; i < 4; i++ { step := k + i/2 // 本次移动的步数,分别是2次的倍数 for j := 0; j < step; j++ { x = x + dx[i] y = y + dy[i] if 0 <= x && x < rows && 0 <= y && y < cols { res = append(res, []int{x, y}) index++ if index == total { return res } } } } } return res}
2、遍历;时间复杂度O(n^2),空间复杂度O(n^2)
// 顺时针:上右下左// 本题:右、下、左、上var dx = []int{0, 1, 0, -1}var dy = []int{1, 0, -1, 0}func spiralMatrixIII(rows int, cols int, rStart int, cStart int) [][]int { res := make([][]int, 0) total := rows * cols x, y := rStart, cStart index := 0 step := 2 dir := 0 for index < total { for i := 0; i < step/2; i++ { // 本次移动的步数 if 0 <= x && x < rows && 0 <= y && y < cols { res = append(res, []int{x, y}) index++ if index == total { return res } } x = x + dx[dir] y = y + dy[dir] } dir = (dir + 1) % 4 step++ } return res}总结
Medium题目,按照题目要求进行模拟,如果在范围内就加入结果
标签: #螺旋矩阵java实现