力扣今日题-873. 最长的斐波那契子序列的长度
873. 最长的斐波那契子序列的长度
思路:
class Solution {
public int lenLongestFibSubseq(int[] arr) {
//字典优化,k,value对的形式保存
Map<Integer, Integer> indices = new HashMap<Integer, Integer>();
//取得arr的长度
int n = arr.length;
//的值和下标保存进字典,这样时间复杂度会下降,k是值,value是下标
for (int i = 0; i < n; i++) {
indices.put(arr[i], i);
}
//构造dp数组:dp[i][j]:以arr[i],arr[j]为结尾的序列的最大长度
int[][] dp = new int[n][n];
//定义结果集
int ans = 0;
//开始遍历
for (int i = 0; i < n; i++) {
for (int j = i - 1; j >= 0 && arr[j] * 2 > arr[i]; j--) {
//取出arr[i]-arr[j]的值的下标,没有就返回-1
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;
}
}
自研解法
思路:三个元素下标i,j,k,arr[i]+arr[j] =arr[k],在arr中寻找arr[k],如果有把arr[j]给了arr[i],arr[k]给了arr[j],并重新计算sum,并将cur的值加1,代表子序列的长度加一。然后使用Math.max取最大值,最后再使用三元运算符,若res的值大于等于3,则输出res的值,否则就输出0.
class Solution {
public int lenLongestFibSubseq(int[] arr) {
//若满足条件,则长度最少为3
int res = 2;
//定义变量保存arr的长度
int len = arr.length;
for(int i = 0 ; i < len ; i++){
for(int j = i+1; j < len; j++){
int tempI = arr[i];
int tempJ = arr[j];
//找满足条件的第三个值,从前两个推第三个
int sum = arr[i]+arr[j];
int cur= 2;
/**binarySearch是二分搜索,因为arr是有序的所以搜索时效率高很多 */
while(Arrays.binarySearch(arr,sum) >=0 ){
tempI = tempJ;
tempJ = sum;
sum = tempI + tempJ;
cur++;
}
res = Math.max(res,cur);
}
}
return res>=3?res:0;
}
}
拓展
2022/7/9