Python solution (40ms) with explanation
\nclass Solution(object):\n    def integerBreak(self, n):\n        """\n        :type n: int\n        :rtype: int\n        """\n        if n == 2:\n            
```\nclass Solution(object):\n    def integerBreak(self, n):\n        """\n        :type n: int\n        :rtype: int\n        """\n        if n == 2:\n            return 1\n        if n == 3:\n            return 2\n        list_3 = [3] * (n/3) # generate a list of 3\n        mod_3 = n%3\n        if mod_3 == 1: # if a 1 is left, then add it to the first element to get a 4\n            list_3[0] += 1\n        if mod_3 == 2: # if a 2 is left, then put it into the list\n            list_3.append(2)\n        return reduce(lambda a, b: a*b, list_3)\n```\nThe key for this problem is that we need to break the number to `2`s, `3`s and `4`s.\nFirst we need to know a fact that,` if a,b > 3, |a-b| <= 1, then a*b>=a+b`. \n\nSo, `if n = a + b, a = a1+a2, b=b1+b2`, we should break n to `a1+a2+b1+b2, |a1-a2|<1 and |b1-b2|<1` instead of `a + b`, because `a1*a2>a, b1*b2>b`. However, we shall stop when we get a `3` or `2`, so what we shall do is to find the list of `3` and `2`.\n\nYou may have noticed why the `4` appeared. 'Cause if we break `4`, we get `2+2`, and `2+2 = 2*2`, so it's the same with the condition that we get two `2`s.
[]