public int lenLongestFibSubseq(int[] arr) {
Map<Integer, Integer> indices = new HashMap<>();//根据值寻找下标
int n = arr.length;
for (int i = 0; i < n; i++) {
indices.put(arr[i], i);
}
int[][] dp = new int[n][n];//以(arr[j],arr[i])为结束的最长序列
int ans = 0;
for (int i = 0; i < n; i++) {
//如果[0,j]为一个序列,那么它的长度为j+2;
//当arr[j]<arr[i]的一半,那么arr[k]在arr[j]的后面
for (int j = i - 1;j>=0&& j +2>ans && arr[j] * 2 > arr[i]; j--) {
int k = indices.getOrDefault(arr[i] - arr[j], -1);//得到倒数第三个值及其下标
if (k >= 0) {
dp[j][i] = Math.max(dp[k][j] + 1, 3);
}
ans = Math.max(ans, dp[j][i]);
}
}
return ans;
}
动态规划算法leetcode.873
最新推荐文章于 2022-07-09 22:38:17 发布