问题:
Given an, break it into the sum of at least twoandtheof those .theyou can get.
For , given n = 2,1 (2 = 1 + 1); given n = 10,36 (10 = 3 + 3 + 4).
Note: You maythat n is not less than 2 and notthan 58.
大意:
给出一个正整数n,将其拆分成至少两个正整数的和,并使这些数的乘积最大 。返回你能获得的最大乘积 。
比如,给出 n = 2,返回 1(2 = 1 + 1);给出 n = 10,返回 36(10 = 3 + 3 + 4) 。
【LeetCode笔记:343. Integer Break】
文章插图
注意:你可以假设n在2~58之间 。
思路:
这道题是要考我们一个个猜拆分数字的和的方法吗?不是的,这种找最大乘积是有规律可循的,结论是拆分成多个2和3相乘得出的乘积最大,至于原因要靠数学分析 。
假设将n拆分成相等的多个x相加,那么乘积就是x的n/x次方 。
求导数得出
文章插图
,当 0 < x < e 时这个导数是正的,当 x = e 时等于0,当 x > e 时为负,也就是说这个乘积会在 x < e 时递增,到达 x = e 时达到最大,接着x越大,乘积变小 。所以让 x = e 是最好的,也就是拆分成多个 e ,相乘的结果最大,但是题目要求拆分成正整数,那就只能找和e相近的,那就只能是2和3了,毕竟 2 < e < 3 。
而3离e更近,所以我们倾向于多弄出点3来,但是当取到够多的时候就不得不取2了,比如对于 n = 4,2*2 > 3*1,也就是说,如果取3使得剩下一个数是1,那么就要放弃取3,而取两个2 。
总结就是,将n尽量多拆分成多个3相加,最后如果剩下了4,那就不得不将剩下的4拆分成两个2,此时相乘的乘积一定最大,计算出结果即可 。
刷到现在,随着难度的提升,已经开始出现需要纯粹依靠高等数学来解决的问题,而不再是单纯的逻辑思考,可见数学的重要性 。
代码(Java):
public class Solution {public int integerBreak(int n) {if (n == 2) return 1;else if (n == 3) return 2;int sum = 0;int result = 1;while (true) {if (n > 4) {result = result * 3;n -= 3;} else {result = result * n;break;}}return result;}}
合集:
- LeetCode解题报告 343. Integer Break [medium]
- LeetCode刷题MEDIM篇Product of Array Except
- 月是故乡明季羡林阅读答案 月是故乡明季羡林读书笔记
- 图像特征检测笔记(特征检测基本概念,Harris,Shi-Tomasi
- AI笔记: 运动估计之背景建模
- 莫凡Python学习笔记——Microbial Genetic Algorith
- Raspberry Pi 之 SenseHAT 开发笔记
- 论文笔记--ERNIE
- PE文件结构学习笔记
- 【leetcode_1601】【困难】maximum-number-of