import java.util.ArrayList;
/***
* 给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。
* 示例1
* 输入
* 复制
* [[1,2,3],[4,5,6],[7,8,9]]
* 返回值
* 复制
* [1,2,3,6,9,8,7,4,5]
*
* 核心思路:
* 把一次行遍历加一次竖遍历定义一个子问题,
* 定义每次遍历的下标规则
* 定义每次遍历的移动方向
*
*/
public class NC38 {
public static ArrayList<Integer> spiralOrder(int[][] matrix) {
ArrayList<Integer> result = new ArrayList<>();
if(matrix==null||matrix.length==0){
return result;
}
//水平移动步数
int m = matrix[0].length;
//竖直移动步数
int n = matrix.length-1;
if(m==0&&n==-1){
return result;
}
//水平移动方向(1向右,-1向左)
int mflag = 1;
//竖直移动方向(1向下,-1向上)
int nflag = 1;
//行的起始下标
int mIndex = 0;
//列的起始下标
int nIndex = 0;
while (true){
//水平移动
for (int i = 0; i <m ; i++) {
result.add(matrix[mIndex][(nIndex)]);
nIndex+=mflag;
}
mIndex +=nflag; //上下移
nIndex-=mflag; //恢复越界的下标
mflag=-mflag; //改变方向
m--; //缩短步长
if(n==0){
break;
}
//竖直方向的移动
for (int i = 0; i <n ; i++) {
result.add(matrix[mIndex][(nIndex)]);
mIndex +=nflag;
}
nIndex +=mflag; //左右位移
mIndex-=nflag; //恢复越界的下标
nflag = - nflag;
n--;
if(m==0){
break;
}
}
return result;
}
public static void main(String[] args) {
int a[][] = {{1,2,3},{4,5,6},{7,8,9}};
ArrayList<Integer> result =spiralOrder(a);
System.out.println(result);
}
}
每日算法--牛客螺旋矩阵
最新推荐文章于 2023-11-19 14:29:12 发布