[剑指offer]14-1.剪绳子
14-1.剪绳子
方法一 动态规划
思路:递归式为f(n)=max(f(i), f(n-i)),i=1,2,...,n-1
虽然我现在也没有彻底明白这个递归式是怎么来的,但用的时候还是要注意一下。f(i)是指长度为i时的最大乘积。
但是,上面关于f(i)的定义,当i=1,2,3时是不成立的。
因为,长度为1时,只能返回0;长度为2时,只能返回1,;长度为3时,只能返回2。但是为了方便以后的计算,强行规定f(1)=1,f(2)=2,f(3)=3.
代码
class Solution:
def cuttingRope(self, n: int) -> int:
if n < 2:
return 0
if n == 2:
return 1
if n == 3:
return 2
dp = [0 for _ in range(n+1)]
dp[0] = 0
dp[1] = 1
dp[2] = 2
dp[3] = 3
for i in range(4, n+1):
max = 0
for j in range(1, i//2+1):
dP = dp[j]*dp[i-j]
if max < dP:
max = dP
dp[i] = max
return dp[n]
结果
执行用时 :44 ms, 在所有 Python3 提交中击败了54.30%的用户
内存消耗 :13.5 MB, 在所有 Python3 提交中击败了100.00%的用户
方法二 贪心算法
思路:尽量取3,然后取2.
具体操作如下:对于长度=n的绳子,先取n//3(向下取整)段长度=3m的绳子。如果此时绳子长度仅剩1m,则只取(n//3-1)段3m的绳子(保证剩下的绳长为偶数)。
对于剩下的偶数绳长,将它切成2m一段的绳子即可。
最后的乘积为(3(timesOf3))*(2(timesOf2)).
代码
class Solution:
def cuttingRope(self, n: int) -> int:
if n < 2:
return 0
if n == 2:
return 1
if n == 3:
return 2
timesOf3 = n // 3
if n - timesOf3*3 == 1:
timesOf3 -= 1
timesOf2 = (n - timesOf3*3)//2
return pow(3, timesOf3)*pow(2, timesOf2)
结果
执行用时 :52 ms, 在所有 Python3 提交中击败了30.30%的用户
内存消耗 :13.5 MB, 在所有 Python3 提交中击败了100.00%的用户
写在最后
这道题可以用递归做。但是由于f(1),f(2),f(3)不是当绳子长度为1,2,3时的最大乘积,所以我还没有想到怎么去做。
另外,无论动态规划还是贪心算法,数学原理我仍然蒙圈。这个代码是从剑指offer的C语言翻译过来的,我好像只能做知识的搬运工...
[剑指offer]14-1.剪绳子的更多相关文章
- 【Python】剑指offer 14:剪绳子
题目:给你一根长度为n的绳子,请把绳子剪成m段 (m和n都是整数,n>1并且m>1)每段绳子的长度记为k[0],k[1],-,k[m].请问k[0]k[1]-*k[m]可能的最大乘积是多少 ...
- 剑指offer 面试题. 剪绳子
题目描述 给你一根长度为n的绳子,请把绳子剪成整数长的m段(m.n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],...,k[m].请问k[0]xk[1]x...xk[ ...
- 【Java】 剑指offer(14) 二进制中1的个数
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如把 ...
- 剑指Offer 14. 链表中倒数第k个结点 (链表)
题目描述 输入一个链表,输出该链表中倒数第k个结点. 题目地址 https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?t ...
- [剑指offer] 14. 链表中倒数第K个节点+翻转+逆序打印+合并两个排序链表 + 链表相交(第一个公共节点) (链表)
题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路: 两个指针,起始位置都是从链表头开始,第一个比第二个先走K个节点,当第一个走到链表尾时,第二个指针的位置就是倒数第k个节点.(两指针始终相 ...
- 剑指offer 14. 链表中倒数第 k 个结点
14. 链表中倒数第 k 个结点 题目描述 输入一个链表,输出该链表中倒数第k个结点 法一:快慢指针 快指针先走 k 步,等快指针到达尾部时,慢指针所指结点即是倒数第 k 个结点 public cla ...
- 剑指offer 14:链表中倒数第k个节点
题目描述 输入一个链表,输出该链表中倒数第k个结点. /* public class ListNode { int val; ListNode next = null; ListNode(int va ...
- 剑指offer(14)
题目: 操作给定的二叉树,将其变换为源二叉树的镜像. 思路: 这里有个细节,我们发现,6节点的子节点在操作之后并没有发生变化,所以等会我们在交换的时候,交换的不是节点的数值,而是整个节点. 另外我们进 ...
- 剑指offer 14 调整数组顺序使奇数位于偶数前面
牛客网上的题目还有一个额外的要求,就是不改变数组原始的前后数据,这种可以用队列来存储,或者把前后比较变为相邻的元素比较. 这个题目,主要要考察扩展性,用func函数就实现了扩展性.只需要改func函数 ...
- [剑指Offer] 14.链表中倒数第k个结点
[思路]利用两个相隔为k-1个结点的指针进行遍历,当后一个指针移到末尾时,前一个指针就是要求的结点. /* struct ListNode { int val; struct ListNode *ne ...
随机推荐
- Google Play来华 象征意义 跳板而已
Play来华 象征意义 跳板而已" title="Google Play来华 象征意义 跳板而已"> 每当有大事发生,伴随的就是接连不断的小道消息传出来.就像苹 ...
- mailx发邮件报错Error initializing NSS: Unknown error -8015. . . . message not sent.处理
前提:在配置zabbix3.0监控发送邮件告警时zabbix界面显示邮件以送达,但是QQ邮箱却没有收到邮件,再shell命令行测试发邮件QQ邮箱又是可以收到的,在别人的提醒下用zabbix用户执行发送 ...
- oppo互联网招聘-各类软件测试
一.服务端测试专家 关键词:安全测试.白盒测试.性能测试.自动化.持续集成.服务端 岗位职责: 主导多个高日活产品的测试方案: 试点和推广自动化和持续集成: 改善测试相关流程和规范. 职位要求: 计算 ...
- Oracle的LOB(CLOB)大字段以及(SYS_LOB***$$)清理
文章结构如下: 1.背景: 生产上查询那些大表然后进行清理,然而发现有SYS_LOB0000093441C00002$$这中表段占用30G(只保留一个月,如果保留更久会更大). 2.LOB介绍 Ora ...
- 基于FPGA的RGB图像转灰度图像算法实现
一.前言 最近学习牟新刚编著<基于FPGA的数字图像处理原理及应用>的第六章直方图操作,由于需要将捕获的图像转换为灰度图像,因此在之前代码的基础上加入了RGB图像转灰度图像的算法实现. 2 ...
- C++走向远洋——45(警察和厨师、UML)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- Filter过滤器Listener:监听器
Filter过滤器 1. 概念 web中的过滤器:当访问服务器资源是,过滤器可以将请求拦截下来,完成一些特殊功能: 过滤器的作用 完成通用的操作:例如登录验证.统一编码处理.敏感字符过滤... 快速入 ...
- 7-8 jmu-python-从列表中删除元素 (15 分)
删除列表中所有符合条件的值. 输入格式: 输入n,代表要测试n次.每次测试:首先,输入1行字符串(字符串内的元素使用空格分隔)然后,输入要删除的元素x. 输出格式: 输出删除元素x后的每行字符串.如果 ...
- react-intl 实现 React 国际化多语言
效果预览 React Intl 国际化步骤 创建国际化资源文件 根据语言获取国际化资源 引入 react-intl 的 local data 创建 LocaleProvider 国际化上下文组件 创建 ...
- Python 三程三器的那些事
装饰器 1.什么是装饰器 装饰器本质是函数,用来给其他函数添加新的功能 特点:不修改调用方式.不修改源代码 2.装饰器的作用 装饰器作用:本质是函数(装饰其他函数)就是为其他函数添加其他功能 装饰器必 ...