LeetCode---Integer Break解题分析

题意描述:将一个正整数分解成至少两个正整数数字之和的形式,求所有组合中因子乘积最大的分解,并返回该最大乘积。比如:n=2, return 1(2=1+1); n=10, return 36(10=3+3+4)

解题思路:先找规律

4=2+2,return 4    
5=3+2,return 6     
6=3+3,return 9     
7=3+4,return 12
8=3+3+2,return 18     
9=3+3+3,return 27     
10=3+3+4,return 36     
11=3+3+3+2,return 54
……

总结规律:2=1+1,乘积为1小于本身;3=1+2,乘积为2小于本身;4=2+2,乘积为4等于本身;5=2+3,乘积为6大于本身;6=2+2+2=3+3,乘积最大为9大于本身……

(1)可以发现4是分界点,比4小的数字不再分得到的乘积肯定比本身小,而比4大的数字分解会得到更大的乘积;

(2)分解因子全为2和3时乘积最大,同时要尽可能多的3;
(3)当n%3==0时,因子全为3且3的个数为(n/3)乘积最大;当n%3==1时,因子3的个数为(n/3)-1,余数为4,乘积最大;当n%3==2时,因子3的个数为(n/3),余数为2,乘积最大;

于是有以下代码:

int integerBreak(int n) {
	if(n < 2) return 0;
	else if(n == 2) 
		return 1;
	else if(n == 3)
		return 2;
	
	int mod = n % 3; 先得到模3的余数
	int product = 1; 最终的乘积
	int count = 0;   因子3的个数
	if(mod == 1)
		count = n/3 - 1;
	else count = n/3;
	
	while(count > 0){
		product *= 3;
		--count;
	}
	
	if(mod == 1) product *= 4;
	else if(mod == 2) product *= 2;
		
	return product;
}

上面的代码虽然充分反应了整个思路,但过于冗长繁杂,所以优化为以下代码:

int integerBreak(int n) {
	if(n < 4)
		return n-1;
	
	int product = 1;
	while(n > 4){
		product *= 3;
		n -= 3;
	}
	return product * n;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值