LeetCode: Spiral Matrix 2


30日に挑戦しようと思っていたのに….ははは
今週の車はあまり運転していませんが...
なんだ.言い訳ですが、海外サイトなので韓国時間ではないので、いつもタイミングを逃しています.

問題を解く


与えられた問題は難しくない.
これは2 D配列を螺旋で埋めて戻せばよいという問題です.
スパイラル方向に充填し、dirI、dirJアレイで方向を順次充填します.
実は一方向に移動するので、配列から離れる条件は一方向ごとに1つです.
したがってswitch文で対応する条件をチェックし,配列に値を指定しておけば方向を変えるので,その部分もチェックした.
import java.util.*;
class Solution {
    
    static int[] dirI = {0, 1, 0, -1};
    static int[] dirJ = {1, 0, -1, 0};
    
    public int[][] generateMatrix(int n) {
        int[][] answer = new int[n][n];
        
        int count = 1;
        int dirNumber = 0;
        int indexI = 0;
        int indexJ = 0;
        
        while(true) {
            if(count > n * n) {
                break;
            }
            answer[indexI][indexJ] = count++;
            
            int nextI = indexI + dirI[dirNumber];
            int nextJ = indexJ + dirJ[dirNumber];
            
            switch (dirNumber) {
                case 0:
                    if(nextJ >= n || answer[nextI][nextJ] != 0) {
                        dirNumber++;
                        dirNumber %= 4;
                        nextI = indexI + dirI[dirNumber];
                        nextJ = indexJ + dirJ[dirNumber];
                    }
                case 1:
                    if(nextI >= n || answer[nextI][nextJ] != 0) {
                        dirNumber++;
                        dirNumber %= 4;
                        nextI = indexI + dirI[dirNumber];
                        nextJ = indexJ + dirJ[dirNumber];
                    }
                case 2:
                    if(nextJ < 0 || answer[nextI][nextJ] != 0) {
                        dirNumber++;
                        dirNumber %= 4;
                        nextI = indexI + dirI[dirNumber];
                        nextJ = indexJ + dirJ[dirNumber];
                    }
                default:
                    if(nextI < 0 || answer[nextI][nextJ] != 0) {
                        dirNumber++;
                        dirNumber %= 4;
                        nextI = indexI + dirI[dirNumber];
                        nextJ = indexJ + dirJ[dirNumber];
                    }
            }
            

            indexI = nextI;
            indexJ = nextJ;
        }
        return answer;
    }
}