343. Integer Break

選択した UI 言語に合わせて問題文をロシア語から翻訳します。コードは変更しません。

given 整数 n. return true, если оно является степенью числа четыре. В противном случае return false.

整数 n является степенью числа четыре, если существует 整数 x такое, что n == 4^x.

Input: n = 2

Output: 1

Explanation: 2 = 1 + 1, 1 × 1 = 1.

C# 解法

照合済み/オリジナル
public class Solution {
    public int IntegerBreak(int n) {
        if (n <= 1) return 0;
        
        int[] dp = new int[n + 1];
        
        for (int i = 2; i <= n; i++) {
            for (int j = 1; j <= i / 2; j++) {
                dp[i] = Math.Max(dp[i], Math.Max(j * (i - j), j * dp[i - j]));
            }
        }
        
        return dp[n];
    }
}

C++ 解法

自動ドラフト、提出前に確認
#include <bits/stdc++.h>
using namespace std;

// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
    public int IntegerBreak(int n) {
        if (n <= 1) return 0;
        
        vector<int>& dp = new int[n + 1];
        
        for (int i = 2; i <= n; i++) {
            for (int j = 1; j <= i / 2; j++) {
                dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j]));
            }
        }
        
        return dp[n];
    }
}

Java 解法

自動ドラフト、提出前に確認
import java.util.*;
import java.math.*;

// Auto-generated Java draft from the C# solution. Review API differences before LeetCode submit.
public class Solution {
    public int IntegerBreak(int n) {
        if (n <= 1) return 0;
        
        int[] dp = new int[n + 1];
        
        for (int i = 2; i <= n; i++) {
            for (int j = 1; j <= i / 2; j++) {
                dp[i] = Math.max(dp[i], Math.max(j * (i - j), j * dp[i - j]));
            }
        }
        
        return dp[n];
    }
}

JavaScript 解法

照合済み/オリジナル
var integerBreak = function(n) {
    if (n <= 1) return 0;
    
    let dp = new Array(n + 1).fill(0);
    
    for (let i = 2; i <= n; i++) {
        for (let j = 1; j <= Math.floor(i / 2); j++) {
            dp[i] = Math.max(dp[i], Math.max(j * (i - j), j * dp[i - j]));
        }
    }
    
    return dp[n];
};

Algorithm

Инициализация и базовый случай:

Создайте 配列 dp длиной n + 1, где dp[i] будет хранить максимальное произведение для числа i. Инициализируйте 配列 нулями.

Вычисление максимального произведения:

Для каждого числа i от 2 до n:

Для каждого числа j от 1 до i // 2:

Обновите dp[i] как максимальное значение между текущим dp[i], произведением j и i - j, и произведением j и dp[i - j].

Возврат результата:

return значение dp[n], которое будет максимальным произведением для числа n.

😎

Vacancies for this task

有効な求人 with overlapping task tags are 表示.

すべての求人
有効な求人はまだありません。