🔥 LeetCode 热题 HOT 100: 55 && 56

85 阅读2分钟

“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”

55. 跳跃游戏

一、题目描述:

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

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

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

示例 1:

输入:nums = [2,3,1,1,4]

输出:true

解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。

二、思路分析:

  • 动态规划 定义 dp 数组, dp[i] 的值表示从 i 出发能否到达最后一个下标,状态转移 dp[i] 的值取决 下一个位置 i + step 的 dp 值
  • 最优解, 记录能够跳到的最远位置, 循环过程中 当前位置 大于最远位置时 返回 false

三、AC 代码:

public boolean canJump(int[] nums) {
    int n = nums.length;
    boolean[] dp = new boolean[n];
    dp[n - 1] = true;
    for(int i = n - 2 ; i >=0;i--){
        int step = nums[i];
        if(step == 0) continue;
        for(int j = 1; j <= step && i + j < n; j++){
            dp[i] |= dp[i + j];
            if(dp[i]) break;
        }
    }
    return dp[0];
}


public boolean canJump(int[] nums) {
    int max = 0;

    for(int i = 0; i < nums.length; i++){
        if(i > max) return false;
        max = Math.max(max, i + nums[i]);
    }
    return true;
}

56. 合并区间

一、题目描述:

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

 

示例 1:

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]

输出:[[1,6],[8,10],[15,18]]

解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

二、思路分析:

首先对数组排序, start 小的在前面, start 相同时, end 大的在前面, 准备一个 list存放区间, 遍历intervals, 如果当前区间的start 等于 list中最后一个区间的start时,跳过 ,start不同时, 如果当前区间的start 大于list中最后一个区间的end时, 说明没有交集直接加入到list中, 如果小于等于时,说明存在交集,此时修改最后一个区间的end即可

三、AC 代码:

class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals, (a, b) -> {
            if(a[0] == b[0]){
                return b[1] - a[1];
            }
            return a[0] - b[0];
        });

        List<int[]> list = new ArrayList<>();

        for(int[] arr : intervals){
            if(list.size() == 0){
                list.add(arr);
                continue;
            }

            int[] pre = list.get(list.size() - 1);
            if(pre[0] == arr[0]){
                continue;
            }
            if(arr[0] > pre[1]){
                list.add(arr);
            }else{
                pre[1] = Math.max(pre[1], arr[1]);
            }
        }

        int[][] ans = new int[list.size()][2];
        int index = 0;
        for(int[] arr : list){
            ans[index++] = arr;
        }

        return ans;
    }
}