public int lenLongestFibSubseq(int[] A) {int size A.length;//先把数组A中的所有元素都存储在Set中Set set new HashSet();for (int num : A)set.add(num);//记录构成的最长斐波那契数列的长度int maxLength 0;for (int i 0; i < size; i)for (int j i 1; j (second, firstsecond)second first second;first second - first;//记录当前能构成的斐波那契数列的长度len;}//更新最大的斐波那契数列长度if (len > maxLength)maxLength len;}//能构成斐波那契数列长度必须大于等于3如果小于3//说明不能构成斐波那契数列直接返回0否则返回maxLengthreturn maxLength > 3 ? maxLength : 0;}
for (int j 2; j 0; i--) {//确定A[i]for (int k i - 1; k > 0; k--) {//往前查找A[k]if (A[k] A[i] A[j]) {dp[i][j] dp[k][i] 1;//如果找到就终止内层循环不在往前查找了break;} else if (A[k] A[i] < A[j]) {//题中说了是递增的正整数数组如果当前A[k]//小了那么前面的就更小没有合适的没必要//在往前找了直接终止内层循环break;}}maxLength Math.max(maxLength, dp[i][j]);}}
我们来看下最终代码
public int lenLongestFibSubseq(int[] A) {//记录最大的斐波那契数列的长度int maxLength 0;int length A.length;int[][] dp new int[length][length];for (int j 2; j 0; i--) {//确定A[i]for (int k i - 1; k > 0; k--) {//往前查找A[k]if (A[k] A[i] A[j]) {dp[i][j] dp[k][i] 1;//如果找到就终止内层循环不在往前查找了break;} else if (A[k] A[i] 0 ? maxLength 2 : 0;}
public int lenLongestFibSubseq(int[] A) {//记录最大的斐波那契数列的长度int maxLength 0;int length A.length;int[][] dp new int[length][length];Map map new HashMap();for (int j 0; j 0; i--) {//确定A[i]//因为是递增的如果A[j]和A[i]之间相差比较大//就不需要再往前查找了if (A[j] - A[i] > A[i])continue;//通过map往前查找A[k]int k map.getOrDefault(A[j] - A[i], -1);//如果k不等于-1说明在数组中找到了A[k]这个值if (k > 0) {dp[i][j] dp[k][i] 1;maxLength Math.max(maxLength, dp[i][j]);}}}return maxLength > 0 ? maxLength 2 : 0;}
视频链接
最后再来看下代码
public int lenLongestFibSubseq(int[] A) {//记录最大的斐波那契数列的长度int maxLength 0;int length A.length;int[][] dp new int[length][length];for (int j 2; j < length; j) {//确定A[j]//左右两个指针int left 0;int right j - 1;while (left A[j]) {//因为数组是递增的如果两个指针指向的值//大了那么右指针往左移一步来减小他俩的和right--;} else if (sum 0 ? maxLength 2 : 0;}