LeetCode - Medium - 343. Integer Break

Topic

  • Math
  • Dynamic Programming

Description

link

Given an integer n, break it into the sum of k positive integers, where k >= 2, and maximize the product of those integers.

Return the maximum product you can get.

Example 1:

Input: n = 2
Output: 1
Explanation: 2 = 1 + 1, 1 × 1 = 1.

Example 2:

Input: n = 10
Output: 36
Explanation: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36.

Constraints:

  • 2 <= n <= 58

Analysis

方法一:动态规划

方法二:贪心算法

Carl详细教程

Submissions

public class IntegerBreak {
	
    public int integerBreak(int n) {
        int[] dp = new int[n + 1];
        
        dp[2] = 1;
        
        for(int i = 3; i <= n; i++) {
        	for(int j = 1; j < i - 1; j++) {
        		dp[i] = max(dp[i], j * (i - j), j * dp[i - j]);
        	}
        }
        
    	return dp[n];
    }
    
    private int max(int a, int b, int c) {
    	return Math.max(a, Math.max(b, c));
    }
    
    public int integerBreak2(int n) {
        if (n == 2) return 1;
        if (n == 3) return 2;
        if (n == 4) return 4;
        int result = 1;
        while (n > 4) {
            result *= 3;
            n -= 3;
        }
        result *= n;
        return result;
    }
    
}

Test

import static org.junit.Assert.*;
import org.junit.Test;

public class IntegerBreakTest {

    @Test
    public void test() {
        IntegerBreak iObj = new IntegerBreak();

        assertEquals(1, iObj.integerBreak(2));
        assertEquals(36, iObj.integerBreak(10));
        
        assertEquals(1, iObj.integerBreak2(2));
        assertEquals(36, iObj.integerBreak2(10));
    }
}

你可能感兴趣的:(LeetCode,leetcode)