博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
54. Spiral Matrix
阅读量:5072 次
发布时间:2019-06-12

本文共 3701 字,大约阅读时间需要 12 分钟。

[

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

一刷我记得用的是12 36 98 74 这种方式,然后往里一层。

遇到长宽是1(比如刚才第二层就剩1个5了)和2([1,2],[3,4])的就只遍历,不往里。但是很麻烦,二刷换了个方法。。

public class Solution {    public List
spiralOrder(int[][] matrix) { List
res = new ArrayList
(); int row = matrix.length; if(row == 0) return res; int col = matrix[0].length; if(col == 0) { for(int n = 0; n < row;n++) { res.add(matrix[n][0]); } return res; } helper(0,0,row,col,matrix,res); return res; } public void helper(int currentRow, int currentCol, int rowLeft, int colLeft, int[][] matrix, List
res) { if(rowLeft == 1 && colLeft == 1) { res.add(matrix[currentRow][currentCol]); return; } else if(rowLeft == 1) { for(int n = 0; n < colLeft;n++) { res.add(matrix[currentRow][currentCol]); currentCol++; } return; } else if(colLeft == 1) { for(int m = 0; m < rowLeft;m++) { res.add(matrix[currentRow][currentCol]); currentRow++; } return; } else { } if(rowLeft < 1 || colLeft < 1) return; int tempInt; for(int m = 0; m < colLeft-1; m++) { tempInt = matrix[currentRow][currentCol]; res.add(tempInt); currentCol++; } for(int m = 0; m < rowLeft-1;m++) { tempInt = matrix[currentRow][currentCol]; res.add(tempInt); currentRow++; } for(int m = 0; m < colLeft-1; m++) { tempInt = matrix[currentRow][currentCol]; res.add(tempInt); currentCol--; } for(int m = 0; m < rowLeft-1;m++) { tempInt = matrix[currentRow][currentCol]; res.add(tempInt); currentRow--; } helper(currentRow+1,currentCol+1,rowLeft-2,colLeft-2,matrix,res); }}

二刷和一刷相比最大最大的改变是 I changed the name of method helper() to doThisShit(), which sounds more awesome.

public class Solution {    public List
spiralOrder(int[][] matrix) { List
res = new ArrayList
(); if(matrix.length == 0) return res; /* A B C D */ int A = 0; int B = 0; int C = matrix[0].length-1; int D = matrix.length-1; doThisShit(res,matrix,A,B,C,D); return res; } public void doThisShit(List
res, int[][] matrix, int A, int B, int C, int D) { while(C - B >= 0 && D - A >= 0) { for(int i = B; i <= C;i++)res.add(matrix[A][i]); A++; for(int i = A; i <= D;i++)res.add(matrix[i][C]); C--; for(int i = C; i >= B && D > A-1;i--)res.add(matrix[D][i]); D--; for(int i = D; i >= A && B < C+1;i--)res.add(matrix[i][B]); B++; } }}

[

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

123 69 87 45 纯绕圈。

特殊情况是长和宽是否相等。

比如123456 会算2次,所以下边和左边要判断是否遍历过了。

1 2 3 4 5 6      A  B       C      D  A和D是相等的

上边(A)从1遍历到6,A++;

右边因为A+1超边界,所以不便利,C++;
下边D从6便利到1,D--;(这里反向遍历了654321)
左边因为D-1超边界,所以不遍历,D--;

同理

12345

会发现B反向遍历了一次5到1.

如果采用8个变量来记录位置,分别记录四个角的X和Y,就没这个问题了,但是这里只用4个,后2个循环需要多加一层判断。

转载于:https://www.cnblogs.com/reboot329/p/5875836.html

你可能感兴趣的文章
如何使用Visual Studio 2013 创建Azure云应用
查看>>
elementUi-复选框,使用v-for循环出来的复选框,默认多个值为勾选状态
查看>>
用HttpPost 和 HttpClient 发送请求到web 端回调数据
查看>>
phpstorm mac
查看>>
(二)hadoop系列之__linux虚拟机搭建JDK和Eclipse环境
查看>>
Leetcode::Two Sum
查看>>
学而思Java开发岗位面试
查看>>
解决@ResponseBody不能和 <mvc:annotation-driven>同时使用的问题
查看>>
POJ1004 Financial Management
查看>>
.html(),.text()和.val()的差异总结
查看>>
java笔记之线程简述1
查看>>
写在2015年的技术感想
查看>>
如何将链表反转
查看>>
解决ajax请求后台数据乱码问题&&前台接收
查看>>
网站顶部显示预加载进度条preload.js
查看>>
设计模式之理解篇
查看>>
1、输出 Hello,World!
查看>>
【京东账户】——Mysql/PHP/Ajax爬坑之购物车删除选项
查看>>
使用github进行代码托管
查看>>
poj-1163 动态规划
查看>>