分类 数学 下的文章

一、题目列表:
题目1、

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

数据范围: 2 le n le 602≤n≤60
进阶:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n)

思路:
为了解决这个问题,我们可以采用一个贪心策略,尽量将绳子剪成尽可能多的3(除了最后可能剩下1或2的情况)。这种策略基于数学上的观察:在相同的总和下,将数字拆分成更多的3(或其他大于2的数)通常能得到更大的乘积,因为乘法的增长是指数级的。

2.代码

# -*- coding:utf-8 -*-
class Solution:
    def cutRope(self, number):
        # write code here
        if number == 1:
            return 1
        if number == 2:
            return 1
        if number == 3:
            return 2
        n = number % 3
        b = number // 3
        if n == 0:
            return 3 ** b
        if n == 1:
            return 3 ** (b - 1) * 4
        if n == 2:
            return 3 ** b * 2