Java如何实现螺旋矩阵的详细处理方法?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1031个文字,预计阅读时间需要5分钟。
题目描述:给定一个m×n的矩阵,请按照逆时针旋转顺时针顺序,返回矩阵中所有元素。
示例:输入:[[1, 2, 3], [4, 5, 6], [7, 8, 9]]输出:[1, 2, 3, 6, 9, 8, 7, 4, 5]
思路:这是一道典型的模拟问题。我们可以分析一下前几行的遍历过程,找出规律。
遍历过程:
1.第一行:从左到右遍历
2.第二行:从上到下遍历
3.第三行:从右到左遍历
4.第四行:从下到上遍历
...以此类推,直到遍历完所有行。我们可以根据行和列的索引来判断遍历的方向,并计算出当前遍历的元素值。
代码实现:以下是用Python语言实现的代码示例。
pythondef spiralOrder(matrix): if not matrix: return []
m, n=len(matrix), len(matrix[0]) result=[] top, bottom, left, right=0, m - 1, 0, n - 1
while top <=bottom and left <=right: # 遍历第一行 for i in range(left, right + 1): result.append(matrix[top][i]) top +=1
# 遍历最后一列 for i in range(top, bottom + 1): result.append(matrix[i][right]) right -=1
# 遍历最后一行(如果存在) if top <=bottom: for i in range(right, left - 1, -1): result.append(matrix[bottom][i]) bottom -=1
# 遍历第一列(如果存在) if left <=right: for i in range(bottom, top - 1, -1): result.append(matrix[i][left]) left +=1
return result
运行上述代码,输入示例矩阵[[1, 2, 3], [4, 5, 6], [7, 8, 9]],输出结果为[1, 2, 3, 6, 9, 8, 7, 4, 5]。
题目描述:
给定一 m*n 的矩阵,请按照逆时针螺旋顺序,返回矩阵中所有元素。
示例:
思路:
这是一道典型的模拟问题:
我们可以分析一下,遍历前进轨迹: 向右 - > 向下 -> 向左 -> 向上 -> 向右 …
于是,我们可以在循环中模拟这样的前进轨迹,记录 右,下,上左,四个边界,每次拐弯时更新边界值,再进行下一次拐弯,循环往复,直至结束。结束条件为 左边界加一大于右边界,或者上边界加一大于下边界。
图解:
代码:
class Solution { public List<Integer> spiralOrder(int[][] matrix) { List<Integer> list = new ArrayList<Integer>(); // 思路: 注意上下左右边界 —— 走格子法(一直走,一直走,直到走完了,出去) int left = 0; int right = matrix[0].length - 1; int up = 0; int down = matrix.length - 1; if(right==-1 || down==-1){ return list; } while(true){ // 向右走 for(int i=left; i<=right; i++){ list.add(matrix[up][i]); } // 判断是否结束 if(up+1 > down){ break; } else{ up++; // 更新上边界 } // 向下走 for(int i=up; i<=down; i++){ list.add(matrix[i][right]); } // 判断是否结束 if(right - 1 < left){ break; } else{ right--; // 更新右边界 } // 向左走 for(int i=right; i>=left; i--){ list.add(matrix[down][i]); } // 判断是否结束 if(down-1 < up){ break; } else{ down--; // 更新下边界 } // 向上走 for(int i=down; i>=up; i--){ list.add(matrix[i][left]); } // 判断是否结束 if(left + 1 > right ){ break; } else{ left++; // 更新左边界 } } return list; } }
变式一: 题目描述:
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例:
代码:
class Solution { public int[][] generateMatrix(int n) { int[][] ans = new int[n][n]; int left = 0; int right = n - 1; int up = 0; int down = n - 1; int start = 1; while(true){ // 向右 for(int i=left; i<=right; i++){ ans[up][i] = start; start++; } if(++ up > down){ break; } // 向下 for(int i=up; i<=down; i++){ ans[i][right] = start; start++; } if(-- right < left){ break; } // 向左 for(int i=right; i>=left; i--){ ans[down][i] = start; start++; } if(-- down < up){ break; } // 向上 for(int i=down; i>=up; i--){ ans[i][left] = start; start++; } if(++ left > right){ break; } } return ans; } }
到此这篇关于Java螺旋矩阵处理方法详解的文章就介绍到这了,更多相关Java螺旋矩阵内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!
本文共计1031个文字,预计阅读时间需要5分钟。
题目描述:给定一个m×n的矩阵,请按照逆时针旋转顺时针顺序,返回矩阵中所有元素。
示例:输入:[[1, 2, 3], [4, 5, 6], [7, 8, 9]]输出:[1, 2, 3, 6, 9, 8, 7, 4, 5]
思路:这是一道典型的模拟问题。我们可以分析一下前几行的遍历过程,找出规律。
遍历过程:
1.第一行:从左到右遍历
2.第二行:从上到下遍历
3.第三行:从右到左遍历
4.第四行:从下到上遍历
...以此类推,直到遍历完所有行。我们可以根据行和列的索引来判断遍历的方向,并计算出当前遍历的元素值。
代码实现:以下是用Python语言实现的代码示例。
pythondef spiralOrder(matrix): if not matrix: return []
m, n=len(matrix), len(matrix[0]) result=[] top, bottom, left, right=0, m - 1, 0, n - 1
while top <=bottom and left <=right: # 遍历第一行 for i in range(left, right + 1): result.append(matrix[top][i]) top +=1
# 遍历最后一列 for i in range(top, bottom + 1): result.append(matrix[i][right]) right -=1
# 遍历最后一行(如果存在) if top <=bottom: for i in range(right, left - 1, -1): result.append(matrix[bottom][i]) bottom -=1
# 遍历第一列(如果存在) if left <=right: for i in range(bottom, top - 1, -1): result.append(matrix[i][left]) left +=1
return result
运行上述代码,输入示例矩阵[[1, 2, 3], [4, 5, 6], [7, 8, 9]],输出结果为[1, 2, 3, 6, 9, 8, 7, 4, 5]。
题目描述:
给定一 m*n 的矩阵,请按照逆时针螺旋顺序,返回矩阵中所有元素。
示例:
思路:
这是一道典型的模拟问题:
我们可以分析一下,遍历前进轨迹: 向右 - > 向下 -> 向左 -> 向上 -> 向右 …
于是,我们可以在循环中模拟这样的前进轨迹,记录 右,下,上左,四个边界,每次拐弯时更新边界值,再进行下一次拐弯,循环往复,直至结束。结束条件为 左边界加一大于右边界,或者上边界加一大于下边界。
图解:
代码:
class Solution { public List<Integer> spiralOrder(int[][] matrix) { List<Integer> list = new ArrayList<Integer>(); // 思路: 注意上下左右边界 —— 走格子法(一直走,一直走,直到走完了,出去) int left = 0; int right = matrix[0].length - 1; int up = 0; int down = matrix.length - 1; if(right==-1 || down==-1){ return list; } while(true){ // 向右走 for(int i=left; i<=right; i++){ list.add(matrix[up][i]); } // 判断是否结束 if(up+1 > down){ break; } else{ up++; // 更新上边界 } // 向下走 for(int i=up; i<=down; i++){ list.add(matrix[i][right]); } // 判断是否结束 if(right - 1 < left){ break; } else{ right--; // 更新右边界 } // 向左走 for(int i=right; i>=left; i--){ list.add(matrix[down][i]); } // 判断是否结束 if(down-1 < up){ break; } else{ down--; // 更新下边界 } // 向上走 for(int i=down; i>=up; i--){ list.add(matrix[i][left]); } // 判断是否结束 if(left + 1 > right ){ break; } else{ left++; // 更新左边界 } } return list; } }
变式一: 题目描述:
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例:
代码:
class Solution { public int[][] generateMatrix(int n) { int[][] ans = new int[n][n]; int left = 0; int right = n - 1; int up = 0; int down = n - 1; int start = 1; while(true){ // 向右 for(int i=left; i<=right; i++){ ans[up][i] = start; start++; } if(++ up > down){ break; } // 向下 for(int i=up; i<=down; i++){ ans[i][right] = start; start++; } if(-- right < left){ break; } // 向左 for(int i=right; i>=left; i--){ ans[down][i] = start; start++; } if(-- down < up){ break; } // 向上 for(int i=down; i>=up; i--){ ans[i][left] = start; start++; } if(++ left > right){ break; } } return ans; } }
到此这篇关于Java螺旋矩阵处理方法详解的文章就介绍到这了,更多相关Java螺旋矩阵内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!

