思路:以左上顶点(leftUpRow,leftUpCol) 和 右下顶点(rightDownRow,rightDownCol)为基准,按 照上层,右层,下层,左层遍历输出
来自《算法很美》 原版代码案例不能能全部通过(稍加改进)
public class Dome3 {
public static void main(String[] args) {
int[][] nums = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
//左上顶点和右下顶点
int leftUpRow = 0,leftUpCol = 0,rightDownRow = nums.length - 1,
rightDownCol = nums[0].length - 1;
//当左上顶点和右下顶点收缩至交叉时,退出最外层While循环
while(leftUpRow <= rightDownRow && leftUpCol <= rightDownCol) {
int r = leftUpRow,c = leftUpCol;
//上层
while(c <= rightDownCol) {
System.out.print(nums[r][c++] + " ");
}
c = rightDownCol; //恢复 因为该while循环完,由于c++是后++ 故c必然大于rightC
r++; //接下来需要输出右层元素,r需要+1
if(r > rightDownRow) { //判断
break;
}
//右层
while(r <=rightDownRow) {
System.out.print(nums[r++][c] + " ");
}
r = rightDownRow; //恢复 因为该while循环结束后,由于r++是后++,故r必然大于rightR
c--;
if(c < leftUpCol) {
break;
}
//下层
while(c >= leftUpCol) {
System.out.print(nums[r][c--] + " ");
}
c = leftUpCol; //恢复 因为该while循环结束后,由于c++是后++,故c必然大于leftC
r--;
if(r < leftUpRow) { //判断
break;
}
//左层
while(r > leftUpRow) {
System.out.print(nums[r--][c] + " ");
}
leftUpRow++; //将左上顶点和右下顶点收缩,重复以上操作
leftUpCol++;
rightDownRow--;
rightDownCol--;
}
}
}