LeetCode题解(0842):将数组拆分成斐波那契数列(Python)
发布日期:2021-06-29 19:58:14 浏览次数:2 分类:技术文章

本文共 2253 字,大约阅读时间需要 7 分钟。

题目:(中等)

标签:字符串、贪心算法、回溯算法

解法 时间复杂度 空间复杂度 执行用时
Ans 1 (Python) O ( N 2 ) O(N^2) O(N2) O ( N ) O(N) O(N) 224ms (12.77%)
Ans 2 (Python) O ( N 2 ) O(N^2) O(N2) O ( N ) O(N) O(N) 40ms (96.72%)
Ans 3 (Python)

解法一(暴力解法):

class Solution:    def splitIntoFibonacci(self, S: str) -> List[int]:        N = len(S)        # 判断数字是否合法        def is_valid(n):            return not (int(n) > 0 and n[0] == "0") and int(n) <= (2 ** 31 - 1)        # 检查是否为斐波那契数列        def is_fibonacci(m, n):            if not is_valid(S[:m]) or not is_valid(S[m:n]):                return False            lst = [int(S[:m]), int(S[m:n])]            idx1 = n            while idx1 < N:                nn = lst[-1] + lst[-2]  # 当前项                s1 = str(nn)                idx2 = idx1 + len(s1)                s2 = S[idx1:idx2]                if is_valid(s2) and s1 == s2:                    lst.append(nn)                    idx1 = idx2                else:                    return False            return lst        # 筛选所有的斐波那契数列        for i in range(1, N):            for j in range(i + 1, N):                fibonacci_lst = is_fibonacci(i, j)                if fibonacci_lst:                    return fibonacci_lst        return []

解法二(优化解法一):

class Solution:    def splitIntoFibonacci(self, S: str) -> List[int]:        MAX_INT = 2147483647        N = len(S)        # 判断数字是否合法        def is_valid(n):            return not (int(n) > 0 and n[0] == "0") and int(n) <= MAX_INT        # 检查是否为斐波那契数列        def is_fibonacci(m, n):            if not is_valid(S[:m]) or not is_valid(S[m:n]):                return False            lst = [int(S[:m]), int(S[m:n])]            idx1 = n            while idx1 < N:                nn = lst[-1] + lst[-2]  # 当前项                s1 = str(nn)                idx2 = idx1 + len(s1)                s2 = S[idx1:idx2]                if is_valid(s2) and s1 == s2:                    lst.append(nn)                    idx1 = idx2                else:                    return False            return lst        # 筛选所有的斐波那契数列        for i in range(1, min(10, N)):            for j in range(i + 1, min(i + 10, N)):                fibonacci_lst = is_fibonacci(i, j)                if fibonacci_lst:                    return fibonacci_lst        return []

转载地址:https://dataartist.blog.csdn.net/article/details/108079585 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:LeetCode题解(0848):字母逐个移位转换(Python)
下一篇:LeetCode题解(0833):字符串中的查找与替换(Python)

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月26日 00时38分08秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章