这个东西嘛,主要就是练习思维!我们直接看题目吧!
59. 螺旋矩阵 II
目的就是生成1-n
,然后顺时针放到数组当中。
我们来分析一下这题怎么整?
n / 2
来确定圈数那我们来看看代码把!
class Solution {
public int[][] generateMatrix(int n) {
int[][] res = new int[n][n];
int startX = 0; int startY = 0;// 每一个圈的起点
int loop = n / 2;// 圈数,n为奇数则需要特殊处理中间值
int count = 1;// 数组存储的值
while (loop > 0){
int i = startX;
int j = startY;
// 从左到右
for (j = startY; j < n - startY - 1; j ++){
res[startX][j] = count++;
}
// 从上到下
for (i = startX; i < n - startX - 1; i ++){
res[i][j] = count++;
}
// 从右到左
for (; j > startY; j --){
res[i][j] = count++;
}
// 从下到上
for (; i > startX; i --){
res[i][j] = count++;
}
startX++;startY++;// 起点+1
loop --;// 圈数减1
}
// 奇数需要处理中间值
if (n % 2 == 1) {
int mid = n / 2;
res[mid][mid] = n * n;
}
return res;
}
}
这个是力扣的中等难度的题目,怎么说朋友们,看完上面的代码,相信大家都应该理解啦!(点个关注跟我一起持续学习把!顺带点个赞,哈哈哈哈!)
那我们来挑战第二题把!
54. 螺旋矩阵
这个题目嘛,乍一看,感觉跟上面的很想,感觉很有信心,TMD,做啦半天也没做出来!其实就是跟上面差不多!
目的就是给一个二维数组,顺时针遍历它就行!这道题目和上面区别就是这个是m*n
,上面是n*n
!
这道题目有两个思路
思路1:
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> res = new ArrayList<>();
if (matrix == null && matrix.length == 0 && matrix[0].length == 0){
return res;
}
int rows = matrix.length; int cols = matrix[0].length;
int left = 0; int right = matrix[0].length - 1; int top = 0; int bottom = matrix.length - 1;
while (left <= right && top <= bottom) {
// 从左边到右边
for (int col = left; col <= right; col ++) {
res.add(matrix[left][col]);
}
// 从上面到下面
for (int row = top + 1; row <= bottom; row ++) {
res.add(matrix[row][right]);
}
if (left < right && top < bottom) {
// 从右边到左边
for (int col = right - 1; col >= left + 1; col --) {
res.add(matrix[bottom][col]);
}
// 从下面到上面
for (int row = bottom; row >= top + 1; row --){
res.add(matrix[row][top]);
}
}
left++; right--;
top++; bottom--;
}
return res;
}
}
思路2:
left = 0; int right = matrix[0].length - 1; int top = 0; int bottom = matrix.length - 1;
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> res = new ArrayList<>();
if (matrix == null && matrix.length == 0 && matrix[0].length == 0){
return res;
}
int rows = matrix.length; int cols = matrix[0].length;
int left = 0; int right = matrix[0].length - 1; int top = 0; int bottom = matrix.length - 1;
while (left <= right && top <= bottom) {
// 从左边到右边
for (int col = left; col <= right; col ++) {
res.add(matrix[left][col]);
}
// 从上面到下面
for (int row = top + 1; row <= bottom; row ++) {
res.add(matrix[row][right]);
}
// left == right 可能只有一个或者 只有一列,所以只需要从上到下
// top == bottom 可能只有一个或者 只有一行,所以只需要从左到右边
if (left < right && top < bottom) {
// 从右边到左边
for (int col = right - 1; col >= left + 1; col --) {
res.add(matrix[bottom][col]);
}
// 从下面到上面
for (int row = bottom; row >= top + 1; row --){
res.add(matrix[row][top]);
}
}
left++; right--;
top++; bottom--;
}
return res;
}
}
如果有不理解的地方,或者写的拉垮的地方欢迎评论留言!
感谢大家的阅读,我是Alson_Code,一个喜欢把简单问题复杂化,把复杂问题简单化的程序猿! ❤