剣指Offer:時計回り印刷マトリクス(javaコード実装)

2197 ワード

タイトル記述入力マトリクスは、外向から時計回りに順番に各数字を印刷するものであり、例えば、1 2 3 4 4 4 4 4マトリクス:1 3 3 4 4 4 4 5 6 7 8 9 11 13 13 14 16を入力と、1,2,3,4,8,12,16,15,14,13,5,6,7,11,10の順に数字が印刷される.
最初の左上隅と右下隅を定義します.左上角と右下角がこの矩形の一番外側の輪を形成します.このとき、一番外側の輪を印刷します.次に、一番外側の輪を除去した左上角と右下角を見つけて、この2つの点で形成された輪を印刷し続けます.
//         1  2  3  4 
//         5  6  7  8
//         9 10 11 12
//        13 14 15 16

例えば、1と16を見つけて1,2,3,4,8,12,16,15,14,13,9,5,1を印刷し、6と11を見つけて6,7,11,10を印刷します.
注意境界の場合例えば左上隅の点が0,0右下隅の点が(4,0)の場合は1列だけ印刷この列を印刷します注意境界の場合例えば左上隅の点が0,0右下角の点が(0,4)の場合は1行だけ印刷この行と右下角は左上隅の上にはできません
次はjavaコード実装です
import java.util.ArrayList;
public class Solution {
//         1  2  3  4 
//         5  6  7  8
//         9 10 11 12
//        13 14 15 16
    public ArrayList printMatrix(int [][] matrix) {
        int lr = 0;
        int lc = 0;
        int rr = matrix.length - 1;
        int rc = matrix[0].length - 1;
        ArrayList list = new ArrayList();
        //                                           
        while(lr <= rr && lc <= rc) {
            whirl(matrix, lr++, lc++, rr--, rc--, list);    
        }
        return list;
    }
    //                 
    private void whirl(int[][] array, int lr, int lc, int rr, int rc, ArrayList list) {
        //     
        if(lr == rr) {
            for(int i = lc; i <= rc; i++) {
                list.add(array[lr][i]);
            }
            return;
        }
        //     
        if(lc == rc) {
            for(int i = lr; i <= rr; i++) {
                list.add(array[i][lc]);
            }
            return;
        }
        //     
        //      
        for(int i = lc; i <= rc; i++) {
            list.add(array[lr][i]);
        }
        //       
        for(int i = lr + 1; i <= rr; i++) {
            list.add(array[i][rc]);
        }
        //       
        for(int i = rc - 1; i >= lc ; i--) {
            list.add(array[rr][i]);
        }
        //      
        for(int i = rr -1; i >= lr + 1; i--) {
            list.add(array[i][lc]);
        }

        
    }
}

アルゴリズムリファレンスプログラマーコード面接ガイド左神牛迫