LeetCode 고급 - 나선형 매트릭스

나선 행렬
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]

분석 하 다.
이 문 제 는 생각 이 매우 분명 하 다.하지만 그 중 좌표 가 바 뀌 는 것 은 징 그 러 웠 다.
나의 사고방식 은 고리 수 에 따라 옮 겨 다 니 는 것 이다. 고리 수 는 길이 와 너비 중 비교적 작은 것 에 달 려 있다. 예 를 들 어:
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12]

4. 567917. 환 수 는 3 / 2 = 1 (0 부터 계산 하여 좌표 변환 에 편리 함) 이다
0 라운드 의 출력 순서: [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12] [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12] [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12] [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]
이렇게 하면 사각 에서 중복 출력 을 피 할 수 있다.
코드
    class Solution {
        public List spiralOrder(int[][] matrix) {
            List res = new ArrayList<>();
            if(matrix == null || matrix.length ==0){
                return res;
            }
            int numi = matrix.length;
            int numj = matrix[0].length;
            //  
            int loop = numi>numj?(numj+1)/2:(numi+1)/2;

            for(int i=0;i2,numj-=2){

                for(int col = i;colfor(int row = i+1;row1]);
                }
                //          ,              ,      
                if(numi ==1||numj==1)
                    break;

                for(int col = i+numj-2;col>=i;col--){
                    res.add(matrix[i+numi-1][col]);
                }
                for(int row = i+numi -2;row>i;row--){
                    res.add(matrix[row][i]);
                }
            }
            return res;
        }
    }

좋은 웹페이지 즐겨찾기