剑指 Offer 14- I. 剪绳子

124 阅读1分钟

剑指 Offer 14- I. 剪绳子

这里使用动态规划 效率低 成绩为5%

var cuttingRope = function (n) {
  if (n <= 1) return 1;
  var dp = new Array(n + 1).fill(1);
  dp[2] = 1;
  for (var i = 3; i < n + 1; i++) {
    for (var j = 2; j < i; j++) {
      dp[i] = Math.max(dp[i], Math.max(j * (i - j), j * dp[i - j]));
    }
  }
  return dp[n];
};
console.log(cuttingRope(10));

这里使用贪心算法 效率高 成绩为80% 这道题目的最好解法是使用贪心算法。 核心点在于尽可能把绳子分成长度为 3 的小段,这样乘积最大。 这个结论可以通过数学来证明。具体证明容我后面补充。 依托于这个结论,可以这样设计思路。 1、当绳子长度为 2 时,由于只可能剪成长度为 1 的两段,所以最大乘积为 1 2、当绳子长度为 3 时,可以剪成长度为 1 和长度为 2 的两段,所以最大乘积为 2 3、当绳子长度为 4 时,可以剪成长度为 2 和长度为 2 的两段,所以最大乘积为 4 4、当绳子长度大于了 4 时,总是尽可能的去尝试剪出更多的长度为 3 的绳子,那么操作就是每次循环绳子的操作,每次循环都将绳子长度 n 减去 3,乘积 res 乘以 3 再取模,直到绳子的长度为 1 、2 、3 这三种长度之间的任意一种 5、循环结束时,再将 res 与剩下的绳子长度 n 进行相乘再取模

var cuttingRope = function (n) {
  if (n == 2) return 1;
  if (n == 3) return 2;
  var res = 1;
  while (n > 4) {
    res = (res * 3) % 1000000007;
    n -= 3;
  }
  return (res * n) % 1000000007;
};