• 343. Integer Break


    Given a positive integer n, break it into the sum of at least two positive integers and maximize the product of those integers. Return the maximum product you can get.

    Example 1:

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

    Example 2:

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

    Note: You may assume that n is not less than 2 and not larger than 58.

     

    Approach #1: Math. [C++]

    class Solution {
    public:
        int integerBreak(int n) {
            static vector<int> arr(7, 0);
            arr[2] = 1, arr[3] = 2;
            arr[4] = 4, arr[5] = 6, arr[6] = 9;
            int ans = 1;
            
            while (n > 6) 
                n -= 3, ans *= 3;
            
            return ans * arr[n];
        }
    };
    

      

    Analysis:

    For convenience, say n is sufficiently large and can be broken into any smaller real positive numbers. We now try to calculate which real number generates the largest product.
    Assume we break n into (n / x) x's, then the product will be xn/x, and we want to maximize it.

    Taking its derivative gives us n * xn/x-2 * (1 - ln(x)).
    The derivative is positive when 0 < x < e, and equal to 0 when x = e, then becomes negative when x > e,
    which indicates that the product increases as x increases, then reaches its maximum when x = e, then starts dropping.

    This reveals the fact that if n is sufficiently large and we are allowed to break n into real numbers,
    the best idea is to break it into nearly all e's.
    On the other hand, if n is sufficiently large and we can only break n into integers, we should choose integers that are closer to e.
    The only potential candidates are 2 and 3 since 2 < e < 3, but we will generally prefer 3 to 2. Why?

    Of course, one can prove it based on the formula above, but there is a more natural way shown as follows.

    6 = 2 + 2 + 2 = 3 + 3. But 2 * 2 * 2 < 3 * 3.
    Therefore, if there are three 2's in the decomposition, we can replace them by two 3's to gain a larger product.

    All the analysis above assumes n is significantly large. When n is small (say n <= 10), it may contain flaws.
    For instance, when n = 4, we have 2 * 2 > 3 * 1.
    To fix it, we keep breaking n into 3's until n gets smaller than 10, then solve the problem by brute-force.

    Reference:

    https://leetcode.com/problems/integer-break/discuss/80721/Why-factor-2-or-3-The-math-behind-this-problem.

    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    motion
    Owe Her
    优于自己的过去
    eclipse中开发js会卡,去掉.project中的validate即可
    项目经理的责任
    话不说满_话不说绝_要给自己留后路_留余地
    create table repo_folder_operate_log_bak as select * from repo_folder_operate_log;
    Introduction to Mathematical Thinking
    coursera 《现代操作系统》 -- 第十三周 期末考试
    coursera 《现代操作系统》 -- 第十一周 IO系统
  • 原文地址:https://www.cnblogs.com/h-hkai/p/10389548.html
Copyright © 2020-2023  润新知