单词优化和整站优化,洞口网站开发公司,网站上线 流程,网站建设优化托管原题给定未排序的数组#xff0c;请给出方法找到最长的等差数列。分析题目描述比较简单#xff0c;但是有一个问题我们需要首先搞清楚#xff1a;等差数列中的数字#xff0c;是否要和原始数组中的顺序一致。题目中#xff0c;并没有说明#xff0c;这个就需要大家在面试…原题给定未排序的数组请给出方法找到最长的等差数列。分析题目描述比较简单但是有一个问题我们需要首先搞清楚等差数列中的数字是否要和原始数组中的顺序一致。题目中并没有说明这个就需要大家在面试的过程中和面试官进行交流。我们在这里对两种情况都进行讨论保证数字的顺序等差数列是要求相邻两个元素之间的差是相同的。那我们可以记录下来数组中任意两个数的差并且记录下来。对于数组A记录A[j]-A[i]其中 i构造hashmap如下-1(0,1)(1,2)1(2,3)(4,5)3(3,4)上面已经排好序对于第一个找到等差数列0,1,2对应数字诶5,4,3.第二个3和4位置没有连起来不够成等差数列。方法平均时间复杂度为O(n^2),空间复杂度为O(n^2).无需保证数字的顺序不需要保证数字的顺序与原来数组一致如何找到最长的等差数列呢原来的数组是无序的我们先对数组进行排序最终的一定是排序之后序列的子序列。然后我们采用动态规划的方法解决这个问题。我们假设dp[i][j]表示以A[i]A[j]开始的数列的长度(数列的前两项)dp[i][j]如何表示呢dp[i][j]dp[j][k]1当 A[j]-A[i]A[k]-A[j],及A[k]A[i]2*A[j]。根据dp[i][j]的定义我们知道dp[x][n-1]2也就是 最后一列是2数列只有A[x]和A[n-1]两个元素。首先j从n-2开始向前遍历对于每一个找到i和k满足 A[k]A[i]2*A[j]则有dp[i][j]dp[j][k]1若没有则dp[i][j]就为2.这里找i和k有一个小技巧如下初始ij-1,kj1然后分别向两边遍历如果A[k]A[i]2*A[j]则i--。大家还是参考代码吧