Spiral Matrix
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
For example,
Given the following matrix:
[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ]
You should return [1,2,3,6,9,8,7,4,5].
思路: 用标记法来实现循环控制,缺点会占用m*n的boolean空间,优点,简单,容易理解
用if控制循环方向,while来控制遍历该方向所有值
代码:
- public List<Integer> spiralOrder(int[][] matrix) {
- List<Integer> res = new ArrayList<Integer>();
- int h = matrix.length;
- if(h==0) return res;
- int w = matrix[0].length;
- if(w==0) return res;
- boolean[][] flag = new boolean[h][w];
- res.add(matrix[0][0]);
- flag[0][0] = true;
- int i=0;
- int j=0;
- while(true) {
- if(j+1<w && flag[i][j+1] == false) {
- while(j+1<w && flag[i][j+1] == false) { //要在该方向查询完毕,否则可能有两个方向满足条件
- flag[i][j+1] = true;
- res.add(matrix[i][j+1]);
- j=j+1;
- }
- } else if(i+1<h && flag[i+1][j] == false) {
- while(i+1<h && flag[i+1][j] == false) {
- flag[i+1][j] = true;
- res.add(matrix[i+1][j]);
- i=i+1;
- }
- } else if(j-1>=0 && flag[i][j-1] == false) {
- while(j-1>=0 && flag[i][j-1] == false) {
- flag[i][j-1] = true;
- res.add(matrix[i][j-1]);
- j=j-1;
- }
- } else if(i-1>=0 && flag[i-1][j] == false) {
- while(i-1>=0 && flag[i-1][j] == false) {
- flag[i-1][j] = true;
- res.add(matrix[i-1][j]);
- i = i-1;
- }
- } else {
- break;
- }
- }
- return res;
- }
思路二: 用highrow、lowrow、lowcol、highcol四个变量控制遍历
C++代码:
- vector<int> spiralOrder(vector<vector<int> > &matrix) {
- int lowrow = 0;
- int lowcol = 0;
- vector<int> res;
- int highrow=matrix.size();
- if(highrow==0) return res;
- int highcol=matrix[0].size();
- highrow--;
- highcol--;
- int j=0;
- if(highrow==0) return matrix[0];
- while(true) {
- if(highrow<lowrow||highcol<lowcol) break;
- if(lowrow==highrow) {
- for(j=lowcol;j<=highcol;j++) {
- res.push_back(matrix[lowrow][j]);
- }
- break;
- }
- if(lowcol==highcol) {
- for(j=lowrow;j<=highrow;j++) {
- res.push_back(matrix[j][highcol]);
- }
- break;
- }
- for(j=lowcol;j<=highcol;j++) {
- res.push_back(matrix[lowrow][j]);
- }
- for(j=lowrow+1;j<=highrow;j++) {
- res.push_back(matrix[j][highcol]);
- }
- for(j=highcol-1;j>=lowcol;j--) {
- res.push_back(matrix[highrow][j]);
- }
- for(j=highrow-1;j>lowrow;j--) {
- res.push_back(matrix[j][lowcol]);
- }
- lowrow++;
- lowcol++;
- highcol--;
- highrow--;
- }
- return res;
- }

浙公网安备 33010602011771号