题解 | #剪绳子#
剪绳子
http://www.nowcoder.com/practice/57d85990ba5b440ab888fc72b0751bf8
解析:
- 果想要结果为最大,则数组中不可以出现1。
- 4可以拆分成2×2;5可以拆分成2×3;6可以拆分成3×3;7可以拆分成3×4,4又可以拆分成2×2。前面拆分的乘积都是大于等于拆分前,所以我们可以得出:若想乘积最大,则将该数拆分成最小的两个质数,即2和3。
问题:什么时候剪出2,什么时候剪出3?
此问题可以由8和9这两个数得出结论:8的最大乘积为2×3×3;9的最大乘积为3×3×3。
显而易见,当8求余3不等于0时剪出2,然后剩余6求余3等于0,剪出3,得2×3×3。
9求余3等于0,所以剪出3,剩余6求余3等于0,剪出3,得3×3×3。
代码:
import java.util.*; public class Solution { public int cutRope(int target) { int n = target; int res = 1; ArrayList<Integer> list = new ArrayList<>(); while (n > 0){ if (n % 3 != 0){ list.add(2); n -= 2; }else{ list.add(3); n -=3; } } for (int i = 0; i < list.size(); i++){ res *= list.get(i); } return res; } }
(盲猜这个应该是某某数学定律,只是本人不知道)