暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

873. Length of Longest Fibonacci Subsequence

程序媛的梦想 2019-12-07
180

给一个int数组,求长度最长的斐波那契序列。

思路:

  1. 先定起始的两个元素i和j,然后将A[i]和A[j]相加,看和是否在元素组里,如果在的话,就得到第三个数,然后让A[i]=A[j],A[j]等于之前的和,再继续找新的A[i]和A[j]的和,...,直到它们的和不在原数组里,结束一轮,得到一个斐波那契子序列;

  2. 用相同的方法得到第二个子序列,第三个子序列等,然后每次更新长度,使得长度最长。


时间复杂度:O(n³),空间复杂度:O(n)。

 1    public int lenLongestFibSubseq(int[] A{
2        Set<Integer> set = new HashSet<>();
3        for (int a : A) {
4            set.add(a);
5        }
6        int max = 2;
7        for (int i = 0; i < A.length - 1; i++) {
8            for (int j = i + 1; j < A.length; j++) {
9                int a = A[i], b = A[j], curMax = 2;// 每一Fibonacci序列至少有两个元素
10                while (set.contains(a + b)) {
11                    int tmp = a;
12                    a = b;
13                    b = tmp + b; // b = 原来的a+b
14                    curMax++; // 当前序列长度+1
15                }
16                max = Math.max(max, curMax);// 取最长的序列
17            }
18        }
19        return max == 2 ? 0 : max; // 长度少于3的,舍弃
20    }

文章转载自程序媛的梦想,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论