iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0

Medium
Related Topics: Math / Dynamic Programming
LeetCode Source

解題想法

題目要求我們找到最少步數可以完成 n 個 A 的可能性

這題的解法蠻特別的

此問題的解法等價於因式分解該數字之合

比如說n = 18,因為18 = 2*3*3

則答案就是8=2+3+3

所以我們必須先完成一個子程式 f 包我們做因式分解

在因式分解時,while中止條件是num < 1

而因式是從k開始,k=i+2,此時k=2

k可以整除,則num /= k,且存入factor

之後break,確保下次因式是從當次因式開始

最後sum(f),得到所有因式之合

Complexity

Time Complexity: O(n)
Space Complexity: O(1)

Python

class Solution:
    def minSteps(self, n: int) -> int:
        return sum(self.f(n))

    def f(self, num):
        factor = []
        while num > 1:
            for i in range(num-1):
                k = i + 2
                if num % k == 0:
                    factor.append(k)
                    num = int(num / k)
                    break
        return factor

C++

class Solution {
public:
    int minSteps(int n) {
        vector<int> f;

        while (n > 1) {
            for (int i = 2; i <= n; i++) {
                if (n % i == 0) {
                    f.push_back(i);
                    n /= i;
                    break;
                }
            }
        }

        return accumulate(f.begin(), f.end(), 0);
    }
};

上一篇
[8/18] 264. Ugly Number II
下一篇
[8/20] 1140. Stone Game II
系列文
8月 LeetCode Daily 見聞錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言