“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;
}
}