解题思路

要找到给定数字 与斐波那契数列中数字的最小差值,需要:

  1. 生成斐波那契数列

    • 从0、1开始
    • 每个数是前两个数的和
    • 生成到不小于 的第一个数为止
  2. 计算最小差值

    • 遍历斐波那契数列
    • 计算每个数与 的差的绝对值
    • 记录最小差值
  3. 优化点

    • 只需要生成到比 大的第一个斐波那契数
    • 最小差值一定在 相邻的两个斐波那契数之间

代码

#include <iostream>
#include <vector>
#include<climits>
using namespace std;

class Solution {
public:
    int minFibonacciDiff(int n) {
        // 生成斐波那契数列
        vector<int> fib;
        fib.push_back(0);
        fib.push_back(1);
        
        // 生成不超过n+1000的斐波那契数
        while (fib.back() <= n + 1000) {
            fib.push_back(fib[fib.size()-1] + fib[fib.size()-2]);
        }
        
        // 找到最小差值
        int minDiff = INT_MAX;
        for (int num : fib) {
            minDiff = min(minDiff, abs(num - n));
            // 如果当前数已经大于n,后面的差值只会更大
            if (num > n) break;
        }
        
        return minDiff;
    }
};

int main() {
    int n;
    cin >> n;
    
    Solution solution;
    cout << solution.minFibonacciDiff(n) << endl;
    return 0;
}
import java.util.*;

public class Main {
    static class Solution {
        public int minFibonacciDiff(int n) {
            // 生成斐波那契数列
            List<Integer> fib = new ArrayList<>();
            fib.add(0);
            fib.add(1);
            
            // 生成不超过n+1000的斐波那契数
            while (fib.get(fib.size()-1) <= n + 1000) {
                fib.add(fib.get(fib.size()-1) + fib.get(fib.size()-2));
            }
            
            // 找到最小差值
            int minDiff = Integer.MAX_VALUE;
            for (int num : fib) {
                minDiff = Math.min(minDiff, Math.abs(num - n));
                // 如果当前数已经大于n,后面的差值只会更大
                if (num > n) break;
            }
            
            return minDiff;
        }
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        
        Solution solution = new Solution();
        System.out.println(solution.minFibonacciDiff(n));
    }
}
def min_fibonacci_diff(n: int) -> int:
    # 生成斐波那契数列
    fib = [0, 1]
    
    # 生成不超过n+1000的斐波那契数
    while fib[-1] <= n + 1000:
        fib.append(fib[-1] + fib[-2])
    
    # 找到最小差值
    min_diff = float('inf')
    for num in fib:
        min_diff = min(min_diff, abs(num - n))
        # 如果当前数已经大于n,后面的差值只会更大
        if num > n:
            break
    
    return min_diff

if __name__ == "__main__":
    n = int(input())
    print(min_fibonacci_diff(n))

算法及复杂度

  • 算法:动态生成 + 遍历
  • 时间复杂度:,因为斐波那契数列增长速度很快
  • 空间复杂度:,用于存储斐波那契数列