力扣48、旋转图像-----力扣54、螺旋矩阵和GOGOGOGOGOGGO

给定一个 n × n 的二维矩阵表示一个图像。
将图像顺时针旋转 90 度。
说明:
你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。
示例 1:
给定 matrix = 
[
  [1,2,3],
  [4,5,6],
  [7,8,9]
],
原地旋转输入矩阵,使其变为:
[
  [7,4,1],
  [8,5,2],
  [9,6,3]
]
示例 2:
给定 matrix =
[
  [ 5, 1, 9,11],
  [ 2, 4, 8,10],
  [13, 3, 6, 7],
  [15,14,12,16]
], 
原地旋转输入矩阵,使其变为:
[
  [15,13, 2, 5],
  [14, 3, 4, 1],
  [12, 6, 8, 9],
  [16, 7,10,11]
]

一、这道题目熟系矩阵的朋友们可以很轻易的做出来
将矩阵求其转置,再进行交换列的位置即可
二、不熟悉矩阵的朋友也别慌,我们还有一种办法,那就是找规律,我们画下图,然后找4个点,观察他们移动 的规律

package Test2017;

public class rotate {
	// 旋转90度等于,矩阵转置加上调换个列即可
	public void rotate(int[][] matrix) {
		int n = matrix.length;
		// 转置
		for (int i = 0; i < n; i++) {
			for (int j = i; j < n; j++) {
				int k = matrix[i][j];
				matrix[i][j] = matrix[j][i];
				matrix[j][i] = k;
			}
		}
		// 再翻转列
		int mid = 0;
		if (n % 2 == 0)
			mid = n / 2;
		else
			mid = n / 2 + 1;
		for (int i = 0, j = n - 1; i <= mid - 1 && j >= mid; i++, j--) {
			for (int k = 0; k < n; k++) {
				int temp = matrix[k][i];
				matrix[k][i] = matrix[k][j];
				matrix[k][j] = temp;
			}
		}

	}

	// 观察规律法,四点法
	public void rotate2(int[][] matrix) {
		int temp = -1;
		for (int start = 0, end = matrix[0].length - 1; start < end; start++, end--) {
			for (int s = start, e = end; s < end; s++, e--) {
				temp = matrix[start][s];
				matrix[start][s] = matrix[e][start];
				matrix[e][start] = matrix[end][e];
				matrix[end][e] = matrix[s][end];
				matrix[s][end] = temp;

			}
		}
	}

}

下面第54题,这两道题目,异曲同工之妙。
一起学习吧。

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入:
[
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]

这道题目的思路很直接,就是顺时针遍历即可。
上方遍历n-1个
右边n-1个
下边n-1个
左边n-2个
终止的条件是列表中的元素数目等于矩阵的数目即可。
代码如下:

package Test2017;

import java.util.ArrayList;
import java.util.List;

public class spiralO {
	public List<Integer> spiralOrder(int[][] matrix) {
		List<Integer> list = new ArrayList<Integer>();
		int m = matrix.length;
		int n = matrix[0].length;
		int num = 0, count = 0;
		while (count < m * n) {
			if (count == m * n - 1) {
				break;
			}
			int x = num;
			for (; x < n - 1 - num; x++) {// 上
				list.add(matrix[num][x]);
				count++;
			}

			int y1 = x;
			int y = num;
			for (; y < m - 1 - num; y++) {// 右
				list.add(matrix[y][y1]);
				count++;
			}
			int z1 = y;
			int z = x;
			for (; z > num; z--) {// 下
				list.add(matrix[z1][z]);
				count++;
			}
			int u1 = z;
			int u = y;
			for (; u > num; u--) {// 左
				list.add(matrix[u][u1]);
				count++;
			}
			num++;
		}
		if (count == (m * n - 1)) {
			list.add(matrix[m / 2][n / 2]);
			count++;
		}
		while (count != m * n) {
			list.remove(count - 1);//去重
			count--;
		}
		return list;
	}

	public List<Integer> spiralOrder2(int[][] matrix) {
		List ans = new ArrayList();
		if (matrix.length == 0)
			return ans;
		int r1 = 0, r2 = matrix.length - 1;// 行
		int c1 = 0, c2 = matrix[0].length - 1;// 列
		while (r1 <= r2 && c1 <= c2) {
			for (int c = c1; c <= c2; c++)
				ans.add(matrix[r1][c]);// 上边
			for (int r = r1 + 1; r <= r2; r++) {
				ans.add(matrix[r][c2]);// 右边
			}
			if (r1 < r2 && c1 < c2) {
				for (int c = c2 - 1; c > c1; c--)
					ans.add(matrix[r2][c]);// 下边
				for (int r = r2; r > r1; r--)
					ans.add(matrix[r][c1]);// 左边
			}
			r1++;
			r2--;
			c1++;
			c2--;// 向内部收缩
		}
		return ans;

	}

	public static void main(String[] args) {
		int[][] a = { { 1, 2, 3 } };
		spiralO s = new spiralO();
		List<Integer> l = s.spiralOrder2(a);
		for (int o : l) {
			System.out.println(o);
		}

	}

}

发布了48 篇原创文章 · 获赞 9 · 访问量 2404

猜你喜欢

转载自blog.csdn.net/jjy19971023/article/details/104603589