剪绳子、
一、题目列表:
题目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