java顺时针螺旋遍历M*N的矩阵

java顺时针螺旋遍历M*N的矩阵


给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

示例1:

输入:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]

示例2:

输入:
[
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]

思路:先找出MN和转的圈数的数学关系

int layers = (Math.min(rows, cols) - 1) / 2 + 1;

然后进行四个步骤的编码
往右 往下 往左 往上

往上的代码在特殊情况下会出现重复,所以每次往下或者往上走了哨兵值+1

Shunshizhen.java

import java.util.ArrayList;
import java.util.List;

/**
 * @author Scen
 * @date 2019-04-02 09:43
 */
public class Shunshizhen {
    public static void main(String[] args) {
        int[][] a = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
        int[][] d = {{2, 3, 4}, {5, 6, 7}, {8, 9, 10}, {11, 12, 13}, {14, 15, 16}};
        int[][] b = {{2, 5}, {8, 4}, {0, -1}};
        int[][] c = {{7}, {9}, {6}};
        System.out.println(spiralOrder(c));
    }
    
    
    public static List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> result = new ArrayList<>();
        if (matrix.length == 0 || matrix[0].length == 0) {
            return result;
        }

//        行数
        int rows = matrix.length;
//        列
        int cols = matrix[0].length;
        
        boolean shang = false;
        boolean xia = false;
        int shaobing = 0;

//        圈数
        int layers = (Math.min(rows, cols) - 1) / 2 + 1;
        
        
        for (int layer = 0; layer < layers; layer++) {
            
            
            //        往右走 当前行等于第layer圈 走到(最后一列-圈)
            for (int i = layer; i < cols - layer; i++) {
                result.add(matrix[layer][i]);
            }

//        往下走 当前列等于第layer圈+1   一直走到行减圈停止
            for (int i = layer + 1; i < rows - layer; i++) {
                result.add(matrix[i][(cols - 1) - layer]);
                xia = true;
            }
            if (xia) {
                shaobing++;
            }

//        往左走并且不在当前行 当前行等于第layer圈 一直走到下标为-1+layer+1的那一列
            for (int i = (cols - 1) - (layer + 1); i > (layer - 1) && (rows - 1 - layer) != layer; i--) {
                result.add(matrix[(rows - 1) - layer][i]);
            }

//        往上走并且列数不等于1并且哨兵值小于列数(如果大于或者等于说明数据已经往下走过一遍了)
            for (int i = (rows - 1) - (layer + 1); i > (layer) && cols != 1 && shaobing < cols; i--) {
                result.add(matrix[i][layer]);
                shang = true;
            }
            
            if (shang) {
                shaobing++;
            }
            
        }
        return result;
    }
}

力扣通过

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章