第 24 天

数学(中等)

剑指 Offer 14- I. 剪绳子

给你一根长度为 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

题解思路:动态规划、贪婪算法

动态规划:不断计算切一刀后乘积的变化

class Solution {
public int cuttingRope(int n) {
// 记录长度为 i 的绳子乘积最大值
int[] dp = new int[n + 1];
dp[2] = 1;
// 从绳子长度为 3 开始计算,因为长度为 2 时为1
for (int i = 3; i <= n; i ++) {
// 计算减长度为 j 的一刀后是否继续减,如果剪完 j 后继续剪,乘积为 dp[i-j]*j,如果不减,则乘积为 (i-j)*j
for (int j = 2; j < i; j ++) {
dp[i] = Math.max(dp[i], Math.max(dp[i-j]*j, (i-j)*j));
}
}
return dp[n];
}
}

复杂度:时间 O(n*n) 空间 O(n)

贪婪算法:获得尽可能多的 3,可以用求导证明

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

复杂度:时间 O(n) 空间 O(1)

剑指 Offer 57 - II. 和为s的连续正数序列

输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。

序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。

示例 1:

输入:target = 9
输出:[[2,3,4],[4,5]]

示例 2:

输入:target = 15
输出:[[1,2,3,4,5],[4,5,6],[7,8]]

限制:

  • 1 <= target <= 10^5

题解思路:滑动窗口

滑动窗口:双指针构成滑动窗口,搜索所有可以的集合

class Solution {
public int[][] findContinuousSequence(int target) {
int i = 1, j = 2;
int sum = 3;
List<int[]> res = new ArrayList<>();
while(i < j) {
if(sum > target) {
sum -= i;
i ++;
}
else if (sum < target){
j ++;
sum += j;
}
else if (sum == target) {
int[] ans = new int[j - i + 1];
for(int k = i; k <= j; k++) {
ans[k - i] = k;
}
res.add(ans);
sum -= i;
i++;
}
}
return res.toArray(new int[0][]);
}
}

复杂度:时间 O(n) 空间 O(n)

剑指 Offer 62. 圆圈中最后剩下的数字

0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。

例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。

示例 1:

输入: n = 5, m = 3
输出: 3

示例 2:

输入: n = 10, m = 17
输出: 2

限制:

  • 1 <= n <= 10^5
  • 1 <= m <= 10^6

题解思路:模拟、动态规划、递归

模拟:循环队列模拟

class Solution {
public int lastRemaining(int n, int m) {
ArrayList<Integer> list = new ArrayList<>(n);
for (int i = 0; i < n; i++) {
list.add(i);
}
int idx = 0;
while (n > 1) {
idx = (idx + m - 1) % n;
list.remove(idx);
n--;
}
return list.get(0);
}
}

复杂度:时间 O(n) 空间 O(n)

动态规划:

class Solution {
public int lastRemaining(int n, int m) {
int f = 0;
for (int i = 2; i != n + 1; ++i) {
f = (m + f) % i;
}
return f;
}
}

复杂度:时间 O(n) 空间 O(1)

递归:

class Solution {
public int lastRemaining(int n, int m) {
return f(n, m);
} public int f(int n, int m) {
if (n == 1) {
return 0;
}
int x = f(n - 1, m);
return (m + x) % n;
}
}

复杂度:时间 O(n) 空间 O(n)

剑指 offer 第 24 天的更多相关文章

  1. 剑指offer 面试24题

    面试24题: 题目:反转链表 题:输入一个链表,反转链表并输出反转后链表的头节点. 解题思路:注意反转时出现断裂现象,定义3个指针,分别指向当前遍历到的节点pNode.它的前一个节点pPrev及后一个 ...

  2. 【Warrior刷题笔记】剑指offer 6 24 35. 三道题,让你学会链表递归迭代辅助栈

    题目一 从尾到头打印链表 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-l ...

  3. 剑指offer(24)二叉树中和为某一值的路径

    题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径 题目分析 这题基本上一看就知道应该深度遍历整个树, ...

  4. 剑指 offer set 24 扑克牌的顺子

    题目 从扑克牌中任意抽取出 5 张牌, 判断是不是顺子, 并且大小王可以看成任意的数字 思路 1. 把大小王当做 0 插入到数组中, 然后对数组排序 2. 统计相邻两个数之间的空隙数, 若空隙数大于 ...

  5. 【剑指Offer】 24、二叉树中和为某一值的路径

      题目描述:   输入一颗二叉树的根结点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中, ...

  6. 【剑指Offer】24、二叉树中和为某一值的路径

    题目描述 输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大 ...

  7. 【剑指Offer】剑指offer题目汇总

      本文为<剑指Offer>刷题笔记的总结篇,花了两个多月的时间,将牛客网上<剑指Offer>的66道题刷了一遍,以博客的形式整理了一遍,这66道题属于相对基础的算法题目,对于 ...

  8. C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解

    剑指offer 面试题24:二叉搜索树的后序遍历序列(的判断) 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true.否则返回false.假设输入的数组的任意两个 ...

  9. 【Java】 剑指offer(24) 反转链表

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头 ...

  10. 剑指 Offer 24. 反转链表

    剑指 Offer 24. 反转链表 Offer 24 题目描述: 常规解法 本题的解法很常规,没有其他特别的坑,只需要将链表反转即可. package com.walegarrett.offer; / ...

随机推荐

  1. 在linux环境下自动执行python脚本

    有时候编辑的py文件,需要进行自动执行时,可以用以下方式进行定时 00 09 * * * /usr/local/bin/python3 /udata/ubi/uenbi_py/trade_all_da ...

  2. Mac版SecureCRT修改配色方案

    SecureCRT是一个非常好用的远程连接工具,其可以配置特定关键词的颜色来使配置调试时更显目的辨别关键内容.网络上关于SecureCRT windows版本如何配置高亮配色的教程很多,但是关于Mac ...

  3. AdaptSegeNet 代码分析

    先G后D 训练 G: --S:pred1, pred2 = model(images) :  loss_seg1 = loss_calc(pred1, labels) :   loss.backwar ...

  4. 07 如果再使用animateCC2018或者苹果系统使用animate时出现Uncaught ReferenceError: lib is not defined的错误

    我刚开始还以为是模板造成的,换了个没有问题的模板就没有问题了,原来问题是这样. 点我预览,请看该文章

  5. modbus_tk Rru

    import serialimport structimport loggingimport modbus_tkimport modbus_tk.defines as cstimport modbus ...

  6. 【jenkins】jenkins 持续集成本地项目(win)

    [项目]--->[配置]: [源码管理]= 无 [Pre Steps]:(因为是windows下,本地装有maven,直接用maven构建,又是个测试用例,就直接用mvn test) 选择win ...

  7. powerbi 模板网站

    微软网站 https://community.powerbi.com/t5/Themes-Gallery/bd-p/ThemesGallery 中国区powerbi比赛网站 http://www.ch ...

  8. Vue3引用全局js

    在vue3中引入全局js: 1,创建一个js文件: 2,在main.js中引入该js文件: import comm from './utils/comm' app.config.globalPrope ...

  9. md5信息摘要算法实现(python 和 go版本)

    纯手写实现的md5信息摘要算法 github地址如下 https://github.com/kittysmith5/dgst/blob/main/md5 python3版本代码 #!/usr/bin/ ...

  10. vue-element-admin 安装运行失败

    1.clone代码后 npm install,结果报错,如下: 解决方法: 在github中的添加新的ssh (生成ssh链接:https://blog.csdn.net/qq_35495339/ar ...