LeetCode--No.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.

For example, given n = 2, return 1 (2 = 1 + 1); given n = 10, return 36 (10 = 3 + 3 + 4).

Note: You may assume that n is not less than 2 and not larger than 58.
思路:
一开始觉得是很难的题,整数的拆分情况那么多。是不是要用递归?还是用NP?然而这是一道easy的题目哇
所以还是应该静下心来,从小的数字开始思考,一点一点试一试,找找规律看。
given n=2 return 2; 
given n=3 return 2; (也就是说,拆分成3,比拆分成2更好)
given n=4 (4=2+2) return 4; 
given n=5 (5=2+3) return 6; (拆分成5的话,还不如继续拆分下去,拆为2和3)
given n=6 (6=3+3) return 9; (拆分成6的话,拆成3和3是最好的)
given n=7 (7=3+4) return 12; (总之还是拆分成2和3的组合了)
所以呢,不管多大的数字,总归是拆分成2和3会更好的。
那么,3和4究竟谁更好呢?
given n=10 (10=3+3+4=3+3+3+1) return 36; 
大致找到了规律,拆分成3的话,就不好继续拆分为2+1了。拆分成4的话,也不要再拆分成3+1了
given n=8 (8=4+4=3+3+2) return 18;
拆分为2个4的话,不如2个3+一个2更大。
所以综上,可以尽可能更多的拆分3,最后剩下一个2,或者一个4。不要有1的存在。

下面可以写代码了

public class Solution {
    public int integerBreak(int n) {
        if(n==2)
            return 1;
        else if(n==3)
            return 2;
        else if(n==4)
            return 4;
        int res = 1;
        while(n>4){
            res *= 3;
            n -= 3;
        }
        res *= n;
        return res;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值