zoukankan      html  css  js  c++  java
  • LeetCode-055-跳跃游戏

    跳跃游戏

    题目描述:给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。

    数组中的每个元素代表你在该位置可以跳跃的最大长度。

    判断你是否能够到达最后一个下标。

    示例说明请见LeetCode官网。

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

    解法一:穷举法
    • 首先,如果nums的长度为1,则直接返回true;
    • 如果nums的第一个元素的值是0,由于不可能往后跳跃,所以直接返回false;
    • 当不是前两种情况时,首先,声明一个变量length为数组最大的索引位,声明一个HashSet为jumped记录跳跃过的位置,声明一个队列toJump记录当前走到的位置,首先,将索引位0加入到jumped和toJump,然后遍历队列toJump按照以下过程处理:
      • 从队列中取出一位cur,并将之加入到jumped中;
      • 如果cur对应的数组的值为0,则跳过处理下一个队列中的值;
      • 如果cur对应的数组的值大于等于lengt-cur即可以从当前位置直接跳跃到最后一位,则直接返回true;
      • 否则,将cur之后nums[cur]位的索引位加入到toJump,加入前需要判断是否在jumped和toJump已经存在,如果存在,避免重复处理,跳过,然后处理下一个队列中的值。

    最后,如果队列为空了还没有跳到数组的最后一位,则返回false。

    import java.util.HashSet;
    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.Set;
    
    public class LeetCode_055 {
        public static boolean canJump(int[] nums) {
            if (nums.length == 1) {
                return true;
            }
            if (nums[0] == 0) {
                return false;
            }
            int length = nums.length - 1;
            // 定义走到过的位置
            Set<Integer> jumped = new HashSet<>();
            jumped.add(0);
            // 定义当前到的位置
            Queue<Integer> toJump = new LinkedList<>();
            toJump.add(0);
            while (!toJump.isEmpty()) {
                Integer cur = toJump.poll();
                jumped.add(cur);
                if (nums[cur] == 0) {
                    continue;
                }
                if (nums[cur] >= length - cur) {
                    return true;
                } else {
                    for (int i = nums[cur]; i >= 1; i--) {
                        if (!jumped.contains(cur + i) && !toJump.contains(cur + i)) {
                            toJump.add(cur + i);
                        }
                    }
                }
            }
            return false;
        }
    
        public static void main(String[] args) {
            int[] nums = new int[]{2, 3, 1, 1, 4};
            System.out.println(canJump(nums));
        }
    }
    

    【每日寄语】 好的运气从清晨开始,愿你晨起有微笑,笑里有幸福。

  • 相关阅读:
    oracle单表选择率(selectivity)——计算执行计划的基数
    不该建索引及不走索引的原因
    SQL语言:DDL/DML/DQL/DCL
    HDU 4521 间隔》=1的LIS 线段树+dp
    九度OnlineJudge之1032:ZOJ
    FileUpload的使用案例
    【C++第三课】---新的关键字
    Clash of Clans(COC)资源压缩解密
    jquery第一期:运行第一个jquery
    Java 的zip压缩和解压缩
  • 原文地址:https://www.cnblogs.com/kaesar/p/15131001.html
Copyright © 2011-2022 走看看