小念子

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

给定一个整数数组 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;
    }

 

posted on 2020-11-14 16:11  小念子  阅读(127)  评论(0编辑  收藏  举报