Leetcode 1027. 最长等差数列 Java

题目链接

1027. 最长等差数列 - 力扣(Leetcode)

给你一个整数数组 nums,返回 nums 中最长等差子序列的长度

回想一下,nums 的子序列是一个列表 nums[i1], nums[i2], ..., nums[ik] ,且 0 <= i1 < i2 < ... < ik <= nums.length - 1。并且如果 seq[i+1] - seq[i]0 <= i < seq.length - 1) 的值都相同,那么序列 seq 是等差的。

示例 1: 

输入:nums = [3,6,9,12]
输出:4
解释: 
整个数组是公差为 3 的等差数列。

示例 2: 

输入:nums = [9,4,7,2,10]
输出:3
解释:
最长的等差子序列是 [4,7,10]。

示例 3: 

输入:nums = [20,1,15,3,10,5,8]
输出:4
解释:
最长的等差子序列是 [20,15,10,5]。

提示: 

  • 2 <= nums.length <= 1000
  • 0 <= nums[i] <= 500

 Java代码

class Solution {
    public int longestArithSeqLength(int[] nums) {
        //dp[i][d] = count;代表以nums[i]结尾的d为公差的最长等差数列的长度count
        int[][] dp = new int[nums.length][1001];
        //保存dp中最大的等差数列长度
        int ans = 0;
        //初始化长度为1,代表每一个单独数字都是以自己结尾的等差数列长度为1
        for (int i = 0; i < nums.length; i++){
            for (int j = 0; j < 1001; j++){
                dp[i][j] = 1;
            }
        }
        for (int i = 1; i < nums.length; i++){
            for(int j = 0; j < i; j++){
                //公差加500避免为负数
                int d = nums[i] - nums[j] + 500;
                //在前面找到相同公差的等差数列加入
                dp[i][d] = Math.max(dp[i][d], dp[j][d] + 1);
                ans = Math.max(ans, dp[i][d]);
            }
        }
        return ans;
    }
}

你可能感兴趣的:(leetcode,leetcode,算法,java)