最长等差数列

题目链接

最长等差数列

题目描述

最长等差数列_第1张图片

注意

  • 2 <= nums.length <= 1000
  • 0 <= nums[i] <= 500
  • 子序列中元素顺序不可变

解答思路

  • 本题与最长定差子序列类似,区别是本题的差值不固定,所以对于任意一个位置处的元素,计算其作为最后一个元素的最长等差数列长度时,该元素之前的所有元素与其组成的差值都要参与运算
  • 很容易想到遍历时应该存储之前元素组成等差数列的情况,在遍历到任意位置i时,其作为等差数列的最后一个元素,与前面的元素j组成等差数列(可以理解成两点确认一条直线),假设元素i与元素j的差值为d,dp[i_d] = dp[j_d] + 1,使用map存储等差数列的信息,其中key为A_B(A为元素位置,B为差值),value为该数字为结尾差值为B时最长等差数列长度

代码

class Solution {
    public int longestArithSeqLength(int[] nums) {
        int res = 1;
        int n = nums.length;
        // key为A_B,其中A为元素位置,B为差值,value为该数字为结尾差值为B时最长等差数列长度
        Map<String, Integer> map = new HashMap<>();
        map.put(0 + "_" + 0, 1);
        for (int i = 1; i < n; i++) {
            for (int j = 0; j < i; j++) {
                String preKey = j + "_" + (nums[i] - nums[j]);
                String key = i + "_" + (nums[i] - nums[j]);
                int value = map.getOrDefault(preKey, 1) + 1;
                map.put(key, value);
                res = Math.max(res, value);
            }
        }
        return res;
    }
}

关键点

  • 动态规划的思想
  • key对应A_B,其中A为元素位置,B为差值,A不能直接用元素值,相同元素处于不同位置所能组成的最长等差数列的长度并不相同(在越右侧长度可能越大)
  • 注意元素值相同的情况

你可能感兴趣的:(算法,算法,leetcode,java,数据结构,动态规划)