题目
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
解题思路
arr[a][b]
01 02 03 04 05 06
16 17 18 19 20 07
15 24 23 22 21 08
14 13 12 11 10 09
第一次 右移6位 数组列长
第二次 下移3位
第三次 左移5位
第四次 上移两位
第五次 右移4位
第六次 下移1位
第七次 左移3位
第八次 下移0位
水平方向上的运动:
第一次 右移6位
第三次 左移5位
第五次 右移4位
第七次 左移3位
第八次 下移0位
int moveRight = arr[0].length; //水平方向上的移动步数
moveRight水平方向上的移动步数,每次运动方向改变,通过flag来控制。每次运动完后下次移动步数减一。
竖直方向上的运动
第二次 下移3位
第四次 上移两位
第六次 下移1位
int moveDown = arr.length-1;//竖直方向上的移动步数
moveDown方向上的移动步数,每次运动方向改变,通过flag来控制。每次运动完后下次移动步数减一。
水平运动和竖直运动交替进行,以一次水平运动和一次竖直运动为一组,进行运动,听过flag变量来控制变化的方向,循环,知道有水平运动移动步数或竖直运动移动步数减为0,则循环结束。
程序实现
public class Test04 {
public static void main(String[] args) {
int[][] arr = new int[][] {{1,2,3,4,5,6},
{16,17,18,19,20,7},
{15,24,23,22,21,8},
{14,13,12,11,10,9}};
print(arr);
}
/**
* 请按照顺时针螺旋顺序,返回矩阵中的所有元素。
*
* arr[a][b]
* 01 02 03 04 05 06 第一次 右移6位 数组列长
* 16 17 18 19 20 07 第二次 下移3位
* 15 24 23 22 21 08 第三次 左移5位
* 14 13 12 11 10 09 第四次 上移2位
* 第五次 右移4位
* 第六次 下移1位
* 第七次 左移3位
* 第八次 下移0位
* 变量 moveRight = arr[0].length;水平方向上的移动步数
* 正数右移,负数左移
* 先做水平运动,步数减一
* 变量 moveDown = arr.length;
* 再做垂直运动,步数减1
* flag = -1;
*
*/
public static void print(int arr[][]){
int moveRight = arr[0].length; //水平方向上的移动步数
int indexRight =0; //水平方向上的索引
int moveDown = arr.length-1;//竖直方向上的移动步数
int indexDown =0;//竖直方向上的索引
int flag = 1;//方向判断
while(true){
int i = 0;
int j = 0 ;
//水平移动
if(moveRight != 0 ) {
for (i = 0; i < moveRight; i++) {
System.out.print(arr[indexDown][indexRight + i * flag] + " ");
}
//水平移动后水平方向和竖直方向的索引变化
indexRight += flag * (moveRight - 1);
indexDown += flag;
moveRight--;
}
if(moveDown == 0) break;
//竖直移动
if(moveDown != 0) {
for (j = 0; j < moveDown; j++) {
System.out.print(arr[j * flag + indexDown][indexRight] + " ");
}
//竖直移动后水平方向和竖直方向的索引变化
indexDown += flag * (moveDown - 1);
indexRight += flag * (-1);
moveDown--;
}
if(moveRight == 0) break;
flag = -flag;
}
}
}