给定一个整数数组 A,返回 A 中最长等差子序列的长度。
回想一下,A 的子序列是列表 A[i_1], A[i_2], ..., A[i_k] 其中 0 <= i_1 < i_2 < ... < i_k <= A.length - 1。并且如果 B[i+1] - B[i]( 0 <= i < B.length - 1) 的值都相同,那么序列 B 是等差的。
解答
假设dp[i, diff]表示以A[i]结尾,且公差为diff的子序列
针对下标j(范围[0, i)),diff = A[i] - A[j],如果dp[j, diff]存在,那么dp[i,diff] = dp[j, diff] + 1;否则dp[i,diff] = 2。更新max对的值
可以使用List加Map来表示dp。List<Map<Integer, Integer>> dp = new ArrayList<>();
代码如下:
public int longestArithSeqLength(int[] A) { if (A.length <=2) { return A.length; } int res = 0; List<Map<Integer, Integer>> dp = new ArrayList<>(); // dp[i, diff]表示以A[i]结尾,且公差为diff的子序列 for (int i = 0; i < A.length; ++i) { dp.add(new HashMap<Integer, Integer>()); } for (int i = 1; i < A.length; ++i) { for (int j = 0; j < i; ++j) { int diff = A[i] - A[j]; Map<Integer, Integer> mapJ = dp.get(j); Map<Integer, Integer> mapI = dp.get(i); if (mapJ.containsKey(diff)) { mapI.put(diff, mapJ.get(diff) + 1); } else { mapI.put(diff, 2); } res = Math.max(res, mapI.get(diff)); } } return res; }