讨论/题目交流/🏆 第 181 场力扣周赛/
🏆 第 181 场力扣周赛

欢迎小伙伴们在这里交流分享你的参赛心得以及体验。【前往竞赛

image.png

3 分 - 按既定顺序创建目标数组
4 分 - 四因数
5 分 - 检查网格中是否存在有效路径
6 分 - 最长快乐前缀

纪念第二次参加周赛
第一次参赛的时候只写出了一题。。看答案发现原来这个竞赛比的是速度所以一下子想不到可以直接上暴力法。。
今天写出了前三题
第一题调api
第二题查了快速求因数的方法
第三题用了dfs 写的我吐了 写的有点麻烦肯定能优化但是急着吃饭(不我就是不想想了

    // 1 表示连接左单元格和右单元格的街道。
    // 2 表示连接上单元格和下单元格的街道。
    // 3 表示连接左单元格和下单元格的街道。
    // 4 表示连接右单元格和下单元格的街道。
    // 5 表示连接左单元格和上单元格的街道。
    // 6 表示连接右单元格和上单元格的街道。
    public boolean hasValidPath(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        boolean[][] isVisited = new boolean[m][n];
        return dfs(grid, isVisited, m, n, 0, 0, 0);
    }

    private boolean dfs(
            int[][] grid, boolean[][] isVisited, int m, int n, int i, int j, int expect) {
        if (i < 0
                || i > m - 1
                || j < 0
                || j > n - 1
                || isVisited[i][j]
                || !isExpect(grid[i][j], expect)) return false;
        if (i == m - 1 && j == n - 1) return true;
        int dir = grid[i][j];
        isVisited[i][j] = true;
        switch (dir) {
            case 1:
                return dfs(grid, isVisited, m, n, i, j - 1, 3) // 左
                        || dfs(grid, isVisited, m, n, i, j + 1, 4); // 右
            case 2:
                return dfs(grid, isVisited, m, n, i - 1, j, 1) // 上
                        || dfs(grid, isVisited, m, n, i + 1, j, 2); // 下
            case 3:
                return dfs(grid, isVisited, m, n, i, j - 1, 3) // 左
                        || dfs(grid, isVisited, m, n, i + 1, j, 2); // 下
            case 4:
                return dfs(grid, isVisited, m, n, i, j + 1, 4) // 右
                        || dfs(grid, isVisited, m, n, i + 1, j, 2); // 下
            case 5:
                return dfs(grid, isVisited, m, n, i, j - 1, 3) // 左
                        || dfs(grid, isVisited, m, n, i - 1, j, 1); // 上
            case 6:
                return dfs(grid, isVisited, m, n, i, j + 1, 4) // 右
                        || dfs(grid, isVisited, m, n, i - 1, j, 1); // 上
            default:
                return false;
        }
    }

    private boolean isExpect(int val, int dir) {
        if (dir == 0) return true;
        if (dir == 1) return val == 2 || val == 3 || val == 4; // 上
        if (dir == 2) return val == 2 || val == 5 || val == 6; // 下
        if (dir == 3) return val == 1 || val == 4 || val == 6; // 左
        if (dir == 4) return val == 1 || val == 3 || val == 5; // 右
        return false;
    }
展开全部 41 讨论