微信公众号:路人zhang
网站救助计划

1.为阅读体验,本站无任何广告,也无任何盈利方法,站长一直在用爱发电,现濒临倒闭,希望有能力的同学能帮忙分担服务器成本


2.捐助10元及以上同学,可添加站长微信lurenzhang888,备注捐助网站倒闭后可联系站长领取本站pdf内容


3.若网站能存活下来,后续将会持续更新内容

当前位置: 算法 > 剑指offer > 剑指offer 14-1.剪绳子

题目描述

给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1 并且 m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]*k[1]*…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是 8 时,我们把它剪成长度分别为 2、3、3 的三段,此时得到的最大乘积是 18。

示例 1:

输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1

示例 2:

输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36

提示:

  • 2 <= n <= 58

算法

(数学) O(n)

拆分原则:尽可能的拆出多个 3

四部曲:

  1. 如果 n <= 3 拆成 1 和 n – 1
  2. 如果 n % 3 == 1​ 拆出一个 4
  3. 如果 n % 3 == 2​ 拆出一个 2
  4. 最后剩下的全拆成 3

时间复杂度

O(n)

空间复杂度

O(1)

C++ 代码

class Solution {
public:
    int cuttingRope(int n) {
        if (n <= 3) return 1 * (n - 1);

        int res = 1;
        if (n % 3 == 1) res *= 4, n -= 4;
        if (n % 3 == 2) res *= 2, n -= 2;
        while (n) res *= 3, n -= 3;
        return res;
    }
};

Java 代码

class Solution {
    public int cuttingRope(int n) {
        if (n <= 3) {
            return 1 * (n - 1);
        }

        int res = 1;
        if (n % 3 == 1) {
            res *= 4;
            n -= 4;
        }
        if (n % 3 == 2) {
            res *= 2;
            n -= 2;
        }
        while (n > 0) {
            res *= 3;
            n -= 3;
        }
        return res;
    }
}

Python 代码

class Solution:
    def cuttingRope(self, n: int) -> int:
        if n <= 3:
            return 1 * (n - 1)

        res = 1
        if n % 3 == 1:
            res *= 4
            n -= 4
        if n % 3 == 2:
            res *= 2
            n -= 2
        while n > 0:
            res *= 3
            n -= 3
        return res

本文由读者提供Github地址:https://github.com/tonngw


点击面试手册,获取本站面试手册PDF完整版