k6k4刷题-矩阵打印--螺旋状

今天刷了一道k6k4上的题目,分享一下(欢迎加 算法刷题交流QQ羣:474397739 一起讨论解决各大刷题网站题目)

原题:http://www.k6k4.com/code/qshow/aanstqymm1509803030578

从矩阵的第一个元素A[0][0] 开始,顺时针遍历矩阵的最外层元素,然后从A[1][1]遍历矩阵第二层元素,以此类推,直到遍历完所有的矩阵元素。将结果按遍历顺序放在数组中返回。
提示:矩阵不一定是方正

解题思路:

固定四个顶点,按顺序打印上边、右边、下边、左边,需要特别注意已经遍历过的顶点,使用一个数组记录已经遍历过的点。

直接上代码:

    import java.util.*;
     
    public class Main {
        public static void main(String[] args) {
            int[][] x = new int[][]{
                    new int[]{11, 12, 13, 14, 15},
                    new int[]{16, 17, 18, 19, 20},
                    new int[]{21, 22, 23, 24, 25},
                    new int[]{26, 27, 28, 29, 30},
                    new int[]{31, 32, 33, 34, 35},
            };
     
            int[] result = solution(x, 5, 5); 
     
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < result.length; i++) {
                sb.append(result[i] + ",");
            }
            String str = sb.toString();
            if (str.endsWith(",")) {
                str = str.substring(0, str.length() - 1);
            }
     
            System.out.println(sb);
            //输出:11,12,13,14,15,20,25,30,35,34,33,32,31,26,21,16,17,18,19,24,29,28,27,22,23
     
        }
     
        public static int[] solution(int[][] A, int n, int m) {
     
            boolean[][] visited = new boolean[n][m];
            for (int i = 0; i < n; i++)
                for (int j = 0; j < m; j++)
                    visited[i][j] = false;
     
            int left = 0;
            int right = m - 1;
            int up = 0;
            int down = n - 1;
     
            int index = 0;
            int len = n * m;
            int[] result = new int[len];
            int x, y;
            while (index < len) {
     
                //从左上角开始,从左到右打印
                x = left;
                y = up;
                for (; x <= right && !visited[y][x]; x++) {
                    result[index++] = A[y][x];
                    visited[y][x] = true;
     
                }
     
                //从右上角(往下移一个元素)开始,从上往下打印
                x = right;
                y = up + 1;
                for (; y <= down && !visited[y][x]; y++) {
                    result[index++] = A[y][x];
                    visited[y][x] = true;
                }
     
                //从右下角(往左移一个元素)开始,从右往左打印
                x = right - 1;
                y = down;
                for (; x >= left && !visited[y][x]; x--) {
                    result[index++] = A[y][x];
                    visited[y][x] = true;
                }
     
                //从左下角(往上移一个元素)开始,从下往上打印
                x = left;
                y = down - 1;
                for (; y >= up && !visited[y][x]; y--) {
                    result[index++] = A[y][x];
                    visited[y][x] = true;
                }
     
                left++;
                up++;
                right--;
                down--;
     
            }
     
            return result;
        }
    }

点赞