1-liner in Python


  • 50

    Take the first row plus the spiral order of the rotated remaining matrix. Inefficient for large matrices, but here I got it accepted in 40 ms, one of the fastest Python submissions.

    def spiralOrder(self, matrix):
        return matrix and list(matrix.pop(0)) + self.spiralOrder(zip(*matrix)[::-1])

  • 0
    O

    awesome !!! but should the list() function be applied on later term (outside of zip)?


  • 2

    You mean list(zip(...))? No, that makes no sense, as zip already returns a list (we have Python 2 here). I see you do that in your solution, and you don't need it. The reason I need it is because I use + to concatenate the parts, and my base case matrix is the empty list but matrix.pop(0) is usually a tuple (since zip creates a list of tuples). And "tuple+list" is not allowed, so I need to convert each tuple to a list. In your solution you can simply work with tuples because you use extend, and lists don't mind being extended by tuples.

    Btw, in case you're wondering: It's not a coincidence that I posted mine so soon after yours, I had seen yours before posting mine. I had written mine about a month ago, though. Don't know why I didn't post it right away, maybe I wanted to post it together with my faster solution(s), which aren't polished yet...


  • 0
    O

    I see. Nice to learn this.


  • 0
    J

    Marvelous! I even don't realize that we could use zip like this! Brava!


  • 0
    B

    Really elegant solution! Thanks for sharing.


  • 0
    R

    oh my god!!!!!!


  • 0
    E

    Really clever use of a rotated matrix. Any idea how large the memory footprint is? Seems like you'll be making a number of copies of the matrix (although it will be decremented by a row/column repeatedly).


  • -1
    S

    run-time error, but it succeed in visual studio, can anyone help me?

        vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> res;
        if(matrix.empty()) return res;
        int m = matrix.size();
        int n = matrix[0].size();
        
        int row=0,col=0;
        int dir=0,left=0,right=n-1,bottom=0,up=m-1;
        for(int i=0;i<m*n;++i)
        {
            res.push_back(matrix[row][col]);
            switch(dir)
            {
                case 0://right
                    if(col == right)
                    {
                        dir++;bottom++;row++;
                    }
                    else
                        col++;
                    break;
                case 1:
                    if(row == up)
                    {
                        dir++;right--;col--;
                    }
                    else
                        row++;
                    break;
                case 2:
                    if(col == left)
                    {
                        dir++;up--;row--;
                    }
                    else
                        col--;
                    break;
                case 3:
                    if(row == bottom)
                    {
                        dir=0;left++;col++;
                    }
                    else
                        row--;
                    break;
            }
        }
        return res;
    }

  • 2
    L

    Sir, I think you can publish a book with a title like "Think in Python" or "Pythonic Coding".


  • 0
    A

    Elegant solution! But much slower than others. Is it rebuilding a list to pass matrix for recursion, or zip, or reverse matrix slowing down?


  • 0
    W

    @oscartsai said in 1-liner in Python:

    applied on later term (outside of zip)?

    in python3.6, it should be add list() on the last term。
    *return matrix and list(matrix.pop(0)) + spiralOrder(list(zip(matrix))[::-1])


  • 0

    @algowl said in 1-liner in Python:

    much slower than others

    What do you mean?


  • 0
    A

    @StefanPochmann said in 1-liner in Python:

    @algowl said in 1-liner in Python:

    much slower than others

    What do you mean?

    Your runtime beats 1.60 % of python submissions.


  • 0

    @algowl That's not true. I just submitted it five times and it beat 9%, 18%, 69%, 69% and 51%. And earlier today, right before I asked you, I had submitted it three times and it beat 51%, 51% and 67%. How often did you submit it? What were the individual results?


  • 0
    W

    @StefanPochmann First, thanks for your solution.It helps me a lot. But, for this question, it justs the difference between py2 and py3. I test in my local environment.
    Just like this:
    A = [[1, 2], [3,,4]]
    zip(*A)[::-1]
    In py2, it can pass.
    But in py3.6, it gives the error likes "TypeError: 'zip' object is not subscriptable".
    So, in leetcode, it supports the py2 and py3, it can be passed.
    That all.Thanks.


  • 0
    A

    @StefanPochmann You are right. It does have a wide distribution, or the variance is too large. Sorry about the false alarm.


  • 0
    W

    This is such an elegant solution. Also learnt the star expression. Thanks!


Log in to reply
 

Looks like your connection to LeetCode Discuss was lost, please wait while we try to reconnect.