一、区间问题
螺旋矩阵II与螺旋矩阵
注意事项
全都按照行和列不一定相同来处理
一个是顺时针生成1个螺旋矩阵,1个是顺时针遍历螺旋矩阵,就当行和列不一定相同来分析,因为行和列相同属于其中1种特殊情况。
思路
借鉴代码随想录的方法,
1、定义好遍历区间全为左闭右开,不要一会左闭右闭一会左闭右开,导致区间的边界定义极其乱套。
2、遍历顺序为最上方1行,最右侧1列,最下方一行,最右侧1列,这样算是1圈,
3、遍历的圈数为矩阵的行数和列数的最小值除以2。
4、用一个int类型的start记录每圈的起点
5、如果矩阵的行数和列数相同,这非常好处理,因为如果为偶数,那么遍历完n/2圈后肯定将矩阵的元素都遍历完了,如果为奇数,那么最后只剩下矩阵的最中间元素(matrix[n/2][n/2]),在最后给该元素赋值为num就行了
6、如果矩阵的行数和列数不相同,通过分析,如果行数和列数的最小值为偶数,那么遍历完Math.min(m/2,n/2)圈后,矩阵所有元素恰好遍历完毕;如果行数和列数的最小值为奇数,那么遍历完Math.min(m/2,n/2)圈后,还有1行或1列元素没遍历完(这个自己举个例子,按照左闭右开的顺序顺时针遍历),如果行数为奇数,那么就遍历中间1行,如果列数为奇数,那么就遍历中间1列。
代码参考
代码可直接在IDEA上运行,进行任何维度的矩阵测试
1、生成螺旋矩阵
以下代码用于从左上角开始顺时针生成螺旋矩阵
//该函数用于生成螺旋矩阵
public class matrix2 {
public static void main(String[] args) {
int m = 5, n = 4;
int[][] matrix = new int[m][n];
int loop_cnt = Math.min(m / 2, n / 2);
int cnt = 0;
int start = 0;
int num = 1;
//遍历区间全部固定为左闭右开
while (cnt < loop_cnt) {
//遍历最上方1行
for (int i = start; i < n - 1 - start; ++i) {
matrix[start][i] = num++;
}
//遍历最右侧1列
for (int i = start; i < m - 1 - start; ++i) {
matrix[i][n - 1 - start] = num++;
}
//遍历最下方1行
for (int i = n - 1 - start; i > start; --i) {
matrix[m - 1 - start][i] = num++;
}
//遍历最左侧1列
for (int i = m - 1 - start; i > start; --i) {
matrix[i][start] = num++;
}
++cnt;
++start;
}
int t = Math.min(m, n);
//只要矩阵的行数与列数的最小值为奇数,就要继续遍历
if (t % 2 == 1) {
if (t == m) {
for (int i = start; i < n - start; ++i) {
matrix[start][i] = num++;
}
} else {
for (int i = start; i < m - start; ++i) {
matrix[i][start] = num++;
}
}
}
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
System.out.print(matrix[i][j] + ",");
}
System.out.println();
}
}
}
2、顺时针遍历矩阵
该思路、注意事项、区间定义方法和生成螺旋矩阵完全相同
将遍历结果存放到list容器里。
代码如下:
import java.util.ArrayList;
import java.util.List;
public class matrix {
public static void main(String[] args) {
int[][] matrix = {{1, 2, 3}, {5, 6, 7}, {9, 10, 11}, {13, 14, 15}, {1, 2, 3}};
int m = matrix.length;
int n = matrix[0].length;
int start = 0;
int loop_cnt = 0;
int cnt = Math.min(m / 2, n / 2);
List<Integer> result = new ArrayList<>();
while (loop_cnt < cnt) {
for (int i = start; i < n - start - 1; ++i) {
result.add(matrix[start][i]);
}
for (int i = start; i < m - start - 1; ++i) {
result.add(matrix[i][n - 1 - start]);
}
for (int i = n - start - 1; i > start; --i) {
result.add(matrix[m - 1 - start][i]);
}
for (int i = m - start - 1; i > start; --i) {
result.add(matrix[i][start]);
}
start++;
loop_cnt++;
}
int t = Math.min(m, n);
if(t % 2 == 1) {
if(t == m) {
for(int i = start; i < n -start; ++i){
result.add(matrix[start][i]);
}
}
else {
for(int i = start; i < m - start; ++i) {
result.add(matrix[i][start]);
}
}
}
for (Integer r : result) {
System.out.print(r + ",");
}
}
}
结尾
目前正进行代码随想录的二刷,发现做过的题全忘了,而且感觉第一遍根本就没弄清楚,所以通过写博客的方式来增强对代码的理解和总结,如文中有任何错误,欢迎批评指正。