Leetcode 3669. Balanced K-Factor Decomposition

  • [Leetcode 3669. Balanced K-Factor Decomposition](#Leetcode 3669. Balanced K-Factor Decomposition)
    • [1. 解题思路](#1. 解题思路)
    • [2. 代码实现](#2. 代码实现)

1. 解题思路

这一题思路上同样还是比较直观的,就是分两步:

  • 第一步就是找出给定的 n n n的所有质因数;
  • 第二步就是探索有的 n n n的质因数的组合,将其合并为 k k k个因数,并使其最为接近。

其中,关于第一步,我们只需要提前计算出所有的质因数,然后遍历一下看看 n n n的所有质因数的分布即可。

然后关于第二步,我们使用一个动态规划即可处理。

2. 代码实现

给出python代码实现如下:

python 复制代码
def get_primes(n):
    primes = []
    status = [0 for _ in range(n+1)]
    for i in range(2, n+1):
        if status[i] == 1:
            continue
        primes.append(i)
        for j in range(i, n+1, i):
            status[j] = 1
    return primes

PRIMES = get_primes(10**5)

class Solution:
    def minDifference(self, n: int, k: int) -> List[int]:
        
        def split(n):
            factors = []
            for p in PRIMES:
                if n < p:
                    break
                while n % p == 0:
                    factors.append(p)
                    n = n // p
            return factors

        factors = split(n)
        if len(factors) <= k:
            return [1] * (k-len(factors)) + factors
        # print(factors)

        @lru_cache(None)
        def dfs(arr):
            if len(arr) == k:
                return arr
            ans = []
            e = arr[0]
            for i, num in enumerate(arr):
                if i == 0:
                    continue
                nxt = list(arr[1:i] + arr[i+1:])
                bisect.insort(nxt, e * num)
                candi = dfs(tuple(nxt))
                if ans == [] or candi[-1]-candi[0] < ans[-1]-ans[0]:
                    ans = candi
            return ans

        return dfs(tuple(factors))

提交代码评测得到:耗时12ms,占用内存18.55MB。

相关推荐
tankeven2 小时前
动态规划专题(03):区间动态规划从原理到实践(未完待续)
c++·算法·动态规划
W23035765735 小时前
经典算法详解:最长公共子序列 (LCS) —— 从暴力递归到动态规划完整实现
算法·动态规划·最长子序列
paeamecium6 小时前
【PAT甲级真题】- Count PAT‘s (25)
c++·算法·动态规划·pat考试·pat
tankeven9 小时前
动态规划专题(14):石子合并问题(未完待续)
c++·算法·动态规划
王老师青少年编程10 小时前
动态规划之【树形DP】第4课:树形DP应用案例实践3
c++·动态规划·dp·树形dp·csp·信奥赛·提高组
W230357657311 小时前
经典算法详解:最大子数组和(暴力 / 分治 / 动态规划 / 线段树)
算法·动态规划·最大字段和
Thomas.Sir13 小时前
AI 赋能放疗&手术规划:靶区智能勾画与剂量路径双重优化【从理论到实战】
人工智能·ai·动态规划·健康医疗·ai医疗·放疗
每日任务(希望进OD版)1 天前
线性DP、区间DP
开发语言·数据结构·c++·算法·动态规划
6Hzlia1 天前
【Hot 100 刷题计划】 LeetCode 279. 完全平方数 | C++ 动态规划 (完全背包)
c++·leetcode·动态规划
木子墨5161 天前
LeetCode 热题 100 精讲 | 动态规划进阶篇:最大子数组和 · 分割等和子集 · 最长公共子序列 · 打家劫舍 III
数据结构·c++·算法·leetcode·动态规划·力扣