Medium
You are given an array of integers nums
.
Your task is to find the length of the longest subsequence seq
of nums
, such that the absolute differences between consecutive elements form a non-increasing sequence of integers. In other words, for a subsequence seq0
, seq1
, seq2
, …, seqm
of nums
, |seq1 - seq0| >= |seq2 - seq1| >= ... >= |seqm - seqm - 1|
.
Return the length of such a subsequence.
A subsequence is an non-empty array that can be derived from another array by deleting some or no elements without changing the order of the remaining elements.
Example 1:
Input: nums = [16,6,3]
Output: 3
Explanation:
The longest subsequence is [16, 6, 3]
with the absolute adjacent differences [10, 3]
.
Example 2:
Input: nums = [6,5,3,4,2,1]
Output: 4
Explanation:
The longest subsequence is [6, 4, 2, 1]
with the absolute adjacent differences [2, 2, 1]
.
Example 3:
Input: nums = [10,20,10,19,10,20]
Output: 5
Explanation:
The longest subsequence is [10, 20, 10, 19, 10]
with the absolute adjacent differences [10, 10, 9, 9]
.
Constraints:
2 <= nums.length <= 104
1 <= nums[i] <= 300
public class Solution {
public int longestSubsequence(int[] nums) {
int max = 0;
for (int n : nums) {
max = Math.max(n, max);
}
max += 1;
int[][] dp = new int[max][max];
for (int i : nums) {
int v = 1;
for (int diff = max - 1; diff >= 0; diff--) {
if (i + diff < max) {
v = Math.max(v, dp[i + diff][diff] + 1);
}
if (i - diff >= 0) {
v = Math.max(v, dp[i - diff][diff] + 1);
}
dp[i][diff] = v;
}
}
int res = 0;
for (int[] i : dp) {
for (int j : i) {
res = Math.max(res, j);
}
}
return res;
}
}