题解 | #牧场边界巡游#

牧场边界巡游

https://www.nowcoder.com/practice/bc7fe78f7bcc49a8bc0afdd7a55ca810

import java.util.*;

public class Solution {
    public int[] spiralTravelCounterClockwise(int[][] matrix) {
        // 行数
        int m = matrix.length;
        // 列数
        int n = matrix[0].length;
        // 结果List
        List<Integer> res = new ArrayList<>();
        // 记录数组元素是否已取走
        boolean[][] flag = new boolean[m][n];
        // 记录循环次数
        int count = 0;
        // 数组坐标(i,j)
        int i = 0, j = 0;
        // 用于判断方向
        int fx = 0;

        // 逆时针螺旋遍历
        while (count < m * n) {
            // 收集数据
            res.add(matrix[i][j]);
            // 标记
            flag[i][j] = true;
            // 记录循环次数
            count++;

            // 更新方向
            if (fx == 0 && (i + 1 >= m || flag[i + 1][j])) {
                // 向下 且 坐标 i + 1 超过行数(越界) 或者 数据已经被标记
                fx++;
            } else if (fx == 1 && (j + 1 >= n || flag[i][j + 1])) {
                // 向右 且 坐标 j + 1 超过列数(越界) 或者 数据已经被标记
                fx++;
            } else if (fx == 2 && (i - 1 < 0 || flag[i - 1][j ])) {
                fx++;
            } else if (fx == 3 && (j - 1 < 0 || flag[i][j - 1])) {
                fx = 0;
            }

            // 向下
            if (fx == 0) i++;
            // 向右
            else if (fx == 1) j++;
            // 向上
            else if (fx == 2) i--;
            // 向左
            else if (fx == 3) j--;
        }

        // 结果数组
        int[] nums = new int[m * n];
        for (int k = 0; k < nums.length; k++) {
            nums[k] = res.get(k);
        }
        // 返回结果
        return nums;
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务