403. 青蛙过河

一只青蛙想要过河。 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有)。 青蛙可以跳上石子,但是不可以跳入水中。

给你石子的位置列表 stones(用单元格序号 升序 表示), 请判定青蛙能否成功过河(即能否在最后一步跳至最后一块石子上)。

开始时, 青蛙默认已站在第一块石子上,并可以假定它第一步只能跳跃一个单位(即只能从单元格 1 跳至单元格 2 )。

如果青蛙上一步跳跃了 k 个单位,那么它接下来的跳跃距离只能选择为 k - 1、k 或 k + 1 个单位。 另请注意,青蛙只能向前方(终点的方向)跳跃。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/frog-jump
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

广度优先搜索

import java.util.HashSet;
import java.util.LinkedList;
import java.util.Objects;
import java.util.Set;

class Solution {

    public static boolean canCross(int[] stones) {
        if (stones == null || stones.length == 0) {
            return true;
        }

        Set<Integer> stoneSet = new HashSet<>();
        for (int stone : stones) {
            stoneSet.add(stone);
        }

        Set<Process> visited = new HashSet<>();

        LinkedList<Process> queue = new LinkedList<>();

        Process initProcess = new Process(stones[0], 0);
        queue.offer(initProcess);
        visited.add(initProcess);

        while (!queue.isEmpty()) {
            Process process = queue.poll();

            if (process.point == stones[stones.length - 1]) {
                return true;
            }

            for (int i = -1; i <= 1; i++) {
                int newPoint = process.point + process.step + i;
                if (newPoint > process.point && stoneSet.contains(newPoint)) {
                    Process nextProcess = new Process(newPoint, process.step + i);
                    if (!visited.contains(nextProcess)) {
                        queue.offer(nextProcess);
                        visited.add(nextProcess);
                    }
                }
            }
        }


        return false;
    }
}

class Process {
    int point;
    int step;

    public Process(int point, int step) {
        this.point = point;
        this.step = step;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Process process = (Process) o;
        return point == process.point &&
                step == process.step;
    }

    @Override
    public int hashCode() {
        return Objects.hash(point, step);
    }
}
上一篇:Nginx设置允许referer头请求、允许跨域等


下一篇:Q:nginx 访问报错403 forbidden