leetcode

来源:互联网 发布:2011年网络春晚 编辑:程序博客网 时间:2024/05/20 22:00

54. Spiral Matrix

Given a matrix of m x n elements(m rows, n columns), return all elements of thematrix 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].

 

 

算法思想

         不断地输出最外面的圈,直到输出完毕。具体要输出多少圈数,为长和宽的较小值再除以2,(画个矩阵就可以看出来),每一个环由4个部分组成的,横,竖,再横,再竖,顺时针刚好走一圈,值得注意的是要注意边界值和重复输出的问题,最好是画个图然后标记出下标来求解。

 

步骤

(第一行指的是开始的第一横行,第一列是第一行后输出的第一列,类似描述同义。

圈数从第0圈开始。

1.      设x,y为当前点的下标,其大小等于圈数的值

2.      输出从当前点第一行和第一列。

3.      判断是否为当行或者单列:

a)        若为单行或者单列,则不用重复输出第二行和第二列。

b)        否则,输出第二行和第二列

4.      圈数+1,跳回第1步。


class Solution {public:        int n ;        int m ;        vector<int> r;    void add_el(int x,int y,vector<vector<int>>& a){            for(int i = x ; i <= n ; i++)r.push_back(a[x][i]);            for(int i = y+1 ; i <= m ; i++) r.push_back(a[i][n]);            if(m == x || n == x)return;            for(int i = n-1 ; i >= x ; i--)r.push_back(a[m][i]);            for(int i = m-1 ; i > x ; i--)r.push_back(a[i][x]);    }        vector<int> spiralOrder(vector<vector<int>>& a) {        if(a.size() < 1)return r;        m = a.size()-1;        n = a[0].size()-1;        int k = n;        k = min(n/2,m/2);        for(int i = 0 ; i <= k ; i++){            add_el(i,i,a);            n --; m--;        }//for(i)              return r;    }};


1 0
原创粉丝点击