牛客网刷题之矩阵螺旋打印、矩阵旋转

题目一描述:
给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。
例如,
给出以下矩阵:

[[ 1, 2, 3 ],[ 4, 5, 6 ],[ 7, 8, 9 ]]

你应该返回[1,2,3,6,9,8,7,4,5]。
题目一分析:
相当于一个m x n的二维数组螺旋进行输出,边界条件可以分为三种:矩阵为空时,直接返回;行大于列时,列大于行时,单独循环打印多余的数。
代码如下:

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> spiralOrder(int[][] matrix) {
         ArrayList<Integer> arrList = new ArrayList<Integer>();
         //数组为空时返回空集合
		 if(matrix == null ||matrix.length==0) return arrList;
		 int left = 0;
		 int right = matrix[0].length-1;
		 int top = 0;
		 int bottom = matrix.length-1;
		 //旋转打印数组
		 while(left < right && top < bottom) {
			for(int j = left;j <= right;j++)arrList.add(matrix[top][j]);
			top++;
			for(int i = top;i <= bottom;i++)arrList.add(matrix[i][right]);
			right--;
			for(int j = right;j >= left;j--)arrList.add(matrix[bottom][j]);
			bottom--;
			for(int i = bottom;i >= top;i--)arrList.add(matrix[i][left]);
			left++;
		 }
		 //只剩余中间一列时,从上到下进行打印
		 if(left == right&& top <= bottom) for(int i=top;i<=bottom;i++) arrList.add(matrix[i][left]);
		 //只剩一行时,从左到右进行打印
		 if(top == bottom && left < right) for(int i=left;i<=right;i++) arrList.add(matrix[top][i]);
		 return arrList;
    }
}

题目二描述:
给出一个用二维矩阵( n x n 2D matrix)表示的图像
返回该图像顺时针旋转90度的结果
扩展:
你能使用原地算法解决这个问题么?
题目二分析:
一个n*n的方针,使用原地算法对其进行旋转90度,因此需要同时指向矩阵的四个对应位置进行交换即可。
代码如下:

public class Solution {
    public void rotate(int[][] matrix) {
       //空数组无需旋转
         if(matrix == null ||matrix.length==0) return ;
			 int left = 0;
			 int right = matrix[0].length-1;
			 int top = 0;
			 int bottom = matrix.length-1;
			 //循环替换四个位置的值
			 while(left < right && top < bottom) {
				for(int j = left,i=right;j < right && i > left;j++,i--) {
					int tmp =matrix[top][j];
					matrix[top][j] = matrix[i][top];
					matrix[i][top] = matrix[bottom][i];
					matrix[bottom][i] = matrix[j][bottom];
					matrix[j][bottom] = tmp;
				}
				left++;right--;top++;bottom--;
			 }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值