用html5做的美食网站,wordpress安装在子目录,wordpress 3.8.1 中文,广州app外包想要精通算法和SQL的成长之路 - 最长等差数列 前言一. 最长等差数列 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 最长等差数列
原题链接
思路#xff1a;
我们假设dp[i][j] 为#xff1a;以num[i]为结尾#xff0c;以j为公差的最长等差子序列的长度。由此可知
我们假设dp[i][j] 为以num[i]为结尾以j为公差的最长等差子序列的长度。由此可知我们的代码存在2个循环。外层循环针对nums的每一个元素下标为i将其视为最长等差子序列的结尾元素。内层循环针对[0i)这个范围的元素求得每种公差的最长等差子序列长度。此时二层循环下标索引为k计算出每个元素和当前num[i]之间的公差j。即有dp[i][j] Max(dp[i][j], dp[k][j] 1)。同时我们用一个全局变量res不断地更新它的最大值即可。res Math.max(res, dp[i][j]);
注意的点
考虑到公差为负数的情况那么结合题目本身我们可以发现公差的范围是[-500,500]为了避免下标越界我们统一把公差的值转为正数。即公差统一加上500那么范围是[0,1000]。我们就可以初始化动态规划数组 int[][] dp new int[nums.length][1001];如果我们没有给数组的所有可能初始化为1单个元素自身也可成为一个子数组长度为1我们只需要返回结果1即可。
最终代码如下
public class Test1027 {public int longestArithSeqLength(int[] nums) {int res Integer.MIN_VALUE;int[][] dp new int[nums.length][1001];for (int i 1; i nums.length; i) {for (int k 0; k i; k) {// 公差统一500int j nums[i] - nums[k] 500;// 更新[0,i) 中所有以 j 为公差 的最长子序列长度同时更新dp[i][j]dp[i][j] Math.max(dp[i][j], dp[k][j] 1);// 更新最大值res Math.max(res, dp[i][j]);}}return res 1;}
}