403. Frog Jump

做这题之前先做了 656 coin path, 感觉 frog jump这题要简单多了。
这题我之前写过几次,不过总是处理不清楚corner case,写的很复杂。
这一次终于很清楚的写出来。
之前犯的错误是初始化的时候选择不够好。
这次初始化选择把第一个点的速度1丢进去然后像其他数据一样处理第一个点。
以前我是从第二个点开始做,然后各种corner case啊。。。
所以代码一定要想办法写的简单。

    public boolean canCross(int[] stones) {
        Map posIndexMap = new HashMap<>();
        // get PosIndexMap
        for (int i = 0; i < stones.length; i++) {
            posIndexMap.put(stones[i], i);
        }
        
        List> dp = new ArrayList<>();
        for (int i = 0; i < stones.length; i++) {
            dp.add(new HashSet<>());
        }
        dp.get(0).add(1);
        for (int i = 0; i < stones.length; i++) {
            Set speedOptions = dp.get(i);
            if (speedOptions.size() == 0) continue;
            int curPos = stones[i];
            for (int speed : speedOptions) {
                if (posIndexMap.containsKey(curPos + speed)) {
                    int nextIndex = posIndexMap.get(curPos + speed);
                    if (curPos + speed == stones[stones.length - 1]) return true;
                    dp.get(nextIndex).add(speed);
                    dp.get(nextIndex).add(speed + 1);
                    if (speed > 1) dp.get(nextIndex).add(speed - 1);
                }
            }
        }
        return false;
    }

你可能感兴趣的:(403. Frog Jump)