(中等)1218、最长定差子序列-字典dp

本文介绍了一种解决LeetCode上的'最长等差子序列'问题的优化算法。通过创建一个字典存储以每个数字结尾的最长等差子序列长度,避免了暴力求解导致的时间复杂度过高。在遍历数组时,利用字典更新每个数字的最长子序列长度,最后返回字典中最大值,得到最长子序列的长度。
摘要由CSDN通过智能技术生成

题目描述

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

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

来源:力扣(LeetCode)
链接:题目描述详情与示例https://leetcode-cn.com/problems/longest-arithmetic-subsequence-of-given-differenceicon-default.png?t=LA46https://leetcode-cn.com/problems/longest-arithmetic-subsequence-of-given-difference

思路

 一开始,直接两重循环判断每个数形成的等差数列的长度,由于时间复杂度过高,转换思路。考虑每个数字结尾的等差数列的长度配以字典的记录方式,这样能减少大量的循环。

具体思路如下:

以字典 dp为存储方式,dp[num] 表示以数字num为结尾的最长的等差子序列的长度。

那么,对于数组中数字arr[i]有,dp[arr[i]]  =  dp[arr[i]  -  difference]

其中,python3中字典的每个键值 key => value 对用冒号 : 分割,每个对之间用逗号(,)分割,整个字典包括在花括号 {} 中,格式:

d = {key1 : value1, key2 : value2, key3 : value3 }

字典的其他语法

class Solution:
    def longestSubsequence(self, arr: List[int], difference: int) -> int:
        dicts = {}
        for i in range(len(arr)):
                if arr[i]-difference in dicts:
                    dicts[arr[i]] = dicts[arr[i]-difference] + 1
                else:
                    dicts[arr[i]] = 1
        return max(dicts.values())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值