1218. 最长定差子序列
1218. 最长定差子序列
题目
Given an integer array arr and an integer difference, return the length of the longest subsequence in arr which is an arithmetic sequence such that the difference between adjacent elements in the subsequence equals difference.
A subsequence is a sequence that can be derived from arr by deleting some or no elements without changing the order of the remaining elements.
Example 1:
Input: arr = [1,2,3,4], difference = 1
Output: 4
Explanation: The longest arithmetic subsequence is [1,2,3,4].
Example 2:
Input: arr = [1,3,5,7], difference = 1
Output: 1
Explanation: The longest arithmetic subsequence is any single element.
Example 3:
Input: arr = [1,5,7,8,5,3,4,2,1], difference = -2
Output: 4
Explanation: The longest arithmetic subsequence is [7,5,3,1].
Constraints:
1 <= arr.length <= 10^5-10^4 <= arr[i], difference <= 10^4
题目大意
给你一个整数数组 arr 和一个整数 difference,请你找出并返回 arr 中最长等差子序列的长度,该子序列中相邻元素之间的差等于 difference 。
子序列 是指在不改变其余元素顺序的情况下,通过删除一些元素或不删除任何元素而从 arr 派生出来的序列。
示例 1:
输入: arr = [1,2,3,4], difference = 1
输出: 4
解释: 最长的等差子序列是 [1,2,3,4]。
示例 2:
输入: arr = [1,3,5,7], difference = 1
输出: 1
解释: 最长的等差子序列是任意单个元素。
示例 3:
输入: arr = [1,5,7,8,5,3,4,2,1], difference = -2
输出: 4
解释: 最长的等差子序列是 [7,5,3,1]。
提示:
1 <= arr.length <= 10^5-10^4 <= arr[i], difference <= 10^4
解题思路
使用哈希表
dpdp[num]表示 以num结尾的最长等差子序列的长度。- 这样可以快速查询
num - difference对应的子序列长度,避免O(n^2)的双层循环。
遍历
arr构建dp- 对于
arr[i] = num,如果num - difference存在于dp,则可以接在num - difference之后形成更长的等差子序列:dp.set(num, (dp.get(num - difference) || 0) + 1); - 维护
maxLen记录最长等差子序列的长度。
- 对于
返回
maxLen作为最终结果- 遍历完数组后,
maxLen记录的是最长等差子序列的长度。
- 遍历完数组后,
复杂度分析
- 时间复杂度:
O(n),因为每个元素在Map中只进行O(1)查询和更新操作。 - 空间复杂度:
O(n),最坏情况下Map需要存储所有arr[i]。
代码
/**
* @param {number[]} arr
* @param {number} difference
* @return {number}
*/
var longestSubsequence = function (arr, difference) {
const dp = new Map();
let maxLen = 1;
for (let num of arr) {
dp.set(num, (dp.get(num - difference) || 0) + 1);
maxLen = Math.max(maxLen, dp.get(num));
}
return maxLen;
};
相关题目
| 题号 | 标题 | 题解 | 标签 | 难度 | 力扣 |
|---|---|---|---|---|---|
| 2453 | 摧毁一系列目标 | 数组 哈希表 计数 | 🟠 | 🀄️ 🔗 |
