LeetCode第54题:螺旋矩阵(中等)

LeetCode第54题:螺旋矩阵(中等)

  • 题目:给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
  • 解法一:就是按照规则一个一个读数据。
class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> ans = new ArrayList<Integer>();
        if (matrix.length == 0) return ans; 
        int l = matrix.length;
        int w = matrix[0].length;

        if(l==1 && w>=1){
            for(int i=0;i<w;i++){
                ans.add(matrix[0][i]);
            }
            return ans;
        }else if(l>=1 && w==1){
            for(int i=0;i<l;i++){
                ans.add(matrix[i][0]);
            }
            return ans;
        }

        int below = l;
        int right = w;
        int top = 0;
        int left = 0;
        int n=0;
        for(int i=0,j=0;i>=top && i<below && j>=left && j<right && n<l*w;){
            if(i==top && j<right-1){
                ans.add(matrix[i][j]);
                j++;
            }else if(i<below-1 && j==right-1){
                ans.add(matrix[i][j]);
                i++;
            }else if(i==below-1 && j>left){
                ans.add(matrix[i][j]);
                j--;
            }else if(i>top && j==left){
                ans.add(matrix[i][j]);
                i--;
            }
            n++;

            if(i==top && j==left){
                i++;
                j++;
                top++;
                left++;
                below--;
                right--;
            }

           if(right-1==left && below-1==top){
               right++;
               below++;
           }

        }
        return ans;

    }  
}

在这里插入图片描述

  • 解法二:通过di来判断读取数据的方向,
class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List ans = new ArrayList();
        if (matrix.length == 0) return ans;
        int R = matrix.length, C = matrix[0].length;
        boolean[][] seen = new boolean[R][C];
        int[] dr = {0, 1, 0, -1};
        int[] dc = {1, 0, -1, 0};
        int r = 0, c = 0, di = 0;
        for (int i = 0; i < R * C; i++) {
            ans.add(matrix[r][c]);
            seen[r][c] = true;
            int cr = r + dr[di];
            int cc = c + dc[di];
            if (0 <= cr && cr < R && 0 <= cc && cc < C && !seen[cr][cc]){
                r = cr;
                c = cc;
            } else {
                di = (di + 1) % 4;
                r += dr[di];
                c += dc[di];
            }
        }
        return ans;
    }
}

作者:LeetCode
链接:https://leetcode-cn.com/problems/spiral-matrix/solution/luo-xuan-ju-zhen-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在这里插入图片描述

  • 解法三:这种做法跟我的比较像,不过比我的简化好多
class Solution {
    public List < Integer > spiralOrder(int[][] matrix) {
        List ans = new ArrayList();
        if (matrix.length == 0)
            return ans;
        int r1 = 0, r2 = matrix.length - 1;
        int c1 = 0, c2 = matrix[0].length - 1;
        while (r1 <= r2 && c1 <= c2) {
            for (int c = c1; c <= c2; c++) ans.add(matrix[r1][c]);
            for (int r = r1 + 1; r <= r2; r++) ans.add(matrix[r][c2]);
            if (r1 < r2 && c1 < c2) {
                for (int c = c2 - 1; c > c1; c--) ans.add(matrix[r2][c]);
                for (int r = r2; r > r1; r--) ans.add(matrix[r][c1]);
            }
            r1++;
            r2--;
            c1++;
            c2--;
        }
        return ans;
    }
}

作者:LeetCode
链接:https://leetcode-cn.com/problems/spiral-matrix/solution/luo-xuan-ju-zhen-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在这里插入图片描述

发布了79 篇原创文章 · 获赞 7 · 访问量 1384

猜你喜欢

转载自blog.csdn.net/new_whiter/article/details/104134433
今日推荐