首页 > 其他分享 >力扣1218.最长定差子序列

力扣1218.最长定差子序列

时间:2024-05-06 16:24:52浏览次数:21  
标签:arr int 1218 力扣 序列 length 差子 difference dp

题目

给你一个整数数组 arr 和一个整数 difference,请你找出并返回 arr 中最长等差子序列的长度,该子序列中相邻元素之间的差等于 difference

​ 子序列 是指在不改变其余元素顺序的情况下,通过删除一些元素或不删除任何元素而从 arr 派生出来的序列。

解题思路

​ 动态规划

1.常规的动态规划解题思路会超时,本题采用 哈希表+动态规划

2.二维dp数组,dp[i][1],dp[i][0] 分别表示第i个数选和不选

3.当前数 i不选时,当前dp的值取决于前一位两种情况的最大值 dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1])

4.当前数 i被选时有两种情况

​ ①默认初始值为1

​ ②与 arr[i]差值为 difference的值存在时获取此值的下标——利用哈希表,

dp[i][1]=Math.max(dp[hash.get(pre)][1]+1,dp[i][1]);

代码

class Solution {
    public int longestSubsequence(int[] arr, int difference) {
        if(arr.length==1){
            return 1;
        }
        int length=arr.length;
        int[][] dp=new int[length][2];
        Map<Integer,Integer> hash=new HashMap<>();
        hash.put(arr[0],0);
        dp[0][1]=1;

        for(int i=1;i<length;i++){
            dp[i][1]=1;
            dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]);

            int pre=arr[i]-difference;
            if(hash.containsKey(pre)){
                dp[i][1]=Math.max(dp[hash.get(pre)][1]+1,dp[i][1]);
            }
            hash.put(arr[i],i);
        }
        
        return Math.max(dp[length-1][0],dp[length-1][1]);
    }
}

标签:arr,int,1218,力扣,序列,length,差子,difference,dp
From: https://www.cnblogs.com/always-uie/p/18175226

相关文章

  • 力扣309.买卖股票的最佳时机含冷冻期
    题目给定一个整数数组prices,其中第prices[i]表示第*i*天的股票价格。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):卖出股票后,你无法在第二天买入股票(即冷冻期为1天)。注意:你不能同时参与多笔交易(你必须在再次......
  • 力扣1235 2024.5.4
    原题网址:https://leetcode.cn/problems/maximum-profit-in-job-scheduling/submissions/529098063/个人难度评价:1600分析:一眼DP,考虑DP顺序,DP递推式与边界十分类似背包,记i为第i段时间,显然有dp[i]=max(dp[i-1],dp[b[i]]+p[i])由此得出递推顺序为按结束时间为第一关键字升序递推......
  • 力扣-304. 二维区域和检索
    1.题目题目地址(304.二维区域和检索-矩阵不可变-力扣(LeetCode))https://leetcode.cn/problems/range-sum-query-2d-immutable/题目描述给定一个二维矩阵matrix,以下类型的多个请求:计算其子矩形范围内元素的总和,该子矩阵的左上角为(row1, col1),右下角为(row2, co......
  • 力扣-303. 区域和检索
    1.题目题目地址(303.区域和检索-数组不可变-力扣(LeetCode))https://leetcode.cn/problems/range-sum-query-immutable/题目描述给定一个整数数组 nums,处理以下类型的多个查询:计算索引 left 和 right (包含left和right)之间的nums元素的和,其中 left<=righ......
  • 力扣198.打家劫舍*
    引言在做动态规划专题的过程中发现打家劫舍是一个十分经典的动态规划类型题,之后的好多题都有这道题的影子,比如我下一篇准备整理的740.删除并获得点数,弄明白打家劫舍真的可以算是动态规划入门了(所以这个动态规划门槛也太高了吧,我的脑子,我的脑子啊)题目你是一个专业的小偷,计划偷窃......
  • 力扣740.删除并获得点数
    题目给你一个整数数组nums,你可以对它进行一些操作。每次操作中,选择任意一个nums[i],删除它并获得nums[i]的点数。之后,你必须删除所有等于nums[i]-1和nums[i]+1的元素。开始你拥有0个点数。返回你能通过这些操作获得的最大点数。解题思路​ 动态规划----打家......
  • 力扣746.使用最小花费爬楼梯
    题目给你一个整数数组cost,其中cost[i]是从楼梯第i个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为0或下标为1的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费解题思路​ 动态规划1.首先需要明确,先支付......
  • 力扣-430. 扁平化多级双向链表
    1.题目题目地址(430.扁平化多级双向链表-力扣(LeetCode))https://leetcode.cn/problems/flatten-a-multilevel-doubly-linked-list/题目描述你会得到一个双链表,其中包含的节点有一个下一个指针、一个前一个指针和一个额外的子指针。这个子指针可能指向一个单独的双向链表,也......
  • 力扣-82. 删除排序链表中的重复元素
    1.题目题目地址(82.删除排序链表中的重复元素II-力扣(LeetCode))https://leetcode.cn/problems/remove-duplicates-from-sorted-list-ii/题目描述给定一个已排序的链表的头 head, 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回已排序的链表 。 示例1:......
  • 力扣-83. 删除排序链表中的重复元素
    1.题目题目地址(83.删除排序链表中的重复元素-力扣(LeetCode))https://leetcode.cn/problems/remove-duplicates-from-sorted-list/题目描述给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回已排序的链表 。 示例1:输入:head=[1,1......