楼主:
Rushia (みけねこ的鼻屎)
2023-06-23 18:48:01https://leetcode.com/problems/longest-arithmetic-subsequence/description/
1027. Longest Arithmetic Subsequence
给你一个整数阵列 nums,找出最长的等差子序列长度。
Example 1:
Input: nums = [3,6,9,12]
Output: 4
Explanation: The whole array is an arithmetic sequence with steps of length
= 3.
Example 2:
Input: nums = [9,4,7,2,10]
Output: 3
Explanation: The longest arithmetic subsequence is [4,7,10].
Example 3:
Input: nums = [20,1,15,3,10,5,8]
Output: 4
Explanation: The longest arithmetic subsequence is [20,15,10,5].
思路:
1.最长子序列(选 or 不选)十之八九是dp,推一下就可以看出规律了。
2.假设 nums = [3,6,9,12]
对于 nums[1] 他可以和 nums[0] 产生一个差 [6-3=3],长度 = [2]
对于 nums[2] 他可以和 nums[0] 和 nums[1] 产生两个差[9-3=6, 9-6=3] 长度=[2,2]
继续往后推导,不失一般性。
3.当我们在 nums[2] 的时候,他会产生两个差[6, 3],如果我们可以知道 nums[2] 之前
的所有元素的所有等差 diff = [...],产生的子序列长度的话,我们就不必每次都重
头算了,我们已知:
nums[1] 在等差为 6 的时候不存在任意子序列,子序列长度为 [] + [9] = 1
nums[1] 在等差为 3 的时候存在子序列 [3, 6],子序列长度为 [3, 6] + [9] = 3
继续往后推导,不失一般性,所以我们可以纪录所有先前子序列的 diff 长度并复用。
4.我们维护一个二维dp[i][diff],表示以 nums[i] 结尾且差值为 diff 的长度,遍历并
更新 dp 的表,且每次都用更新后的值去更新最大长度。
5.diff 因为 0 <= nums[i] <= 500 所以设定大小为 1000 即可,用 Map 也可以。
Java Code: