剑指 offer 第 24 天
第 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^51 <= 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 天的更多相关文章
- 剑指offer 面试24题
面试24题: 题目:反转链表 题:输入一个链表,反转链表并输出反转后链表的头节点. 解题思路:注意反转时出现断裂现象,定义3个指针,分别指向当前遍历到的节点pNode.它的前一个节点pPrev及后一个 ...
- 【Warrior刷题笔记】剑指offer 6 24 35. 三道题,让你学会链表递归迭代辅助栈
题目一 从尾到头打印链表 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-l ...
- 剑指offer(24)二叉树中和为某一值的路径
题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径 题目分析 这题基本上一看就知道应该深度遍历整个树, ...
- 剑指 offer set 24 扑克牌的顺子
题目 从扑克牌中任意抽取出 5 张牌, 判断是不是顺子, 并且大小王可以看成任意的数字 思路 1. 把大小王当做 0 插入到数组中, 然后对数组排序 2. 统计相邻两个数之间的空隙数, 若空隙数大于 ...
- 【剑指Offer】 24、二叉树中和为某一值的路径
题目描述: 输入一颗二叉树的根结点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中, ...
- 【剑指Offer】24、二叉树中和为某一值的路径
题目描述 输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大 ...
- 【剑指Offer】剑指offer题目汇总
本文为<剑指Offer>刷题笔记的总结篇,花了两个多月的时间,将牛客网上<剑指Offer>的66道题刷了一遍,以博客的形式整理了一遍,这66道题属于相对基础的算法题目,对于 ...
- C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解
剑指offer 面试题24:二叉搜索树的后序遍历序列(的判断) 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true.否则返回false.假设输入的数组的任意两个 ...
- 【Java】 剑指offer(24) 反转链表
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头 ...
- 剑指 Offer 24. 反转链表
剑指 Offer 24. 反转链表 Offer 24 题目描述: 常规解法 本题的解法很常规,没有其他特别的坑,只需要将链表反转即可. package com.walegarrett.offer; / ...
随机推荐
- 获取指定字符串第n次出现的位置索引
returnIndex(str,cha,num){ var x=str.indexOf(cha); for(var i=0;i<num;i++){ x=str.indexOf(cha,x+1); ...
- IDEA移除Maven依赖的方法
参考地址:https://blog.csdn.net/weixin_45654405/article/details/124415010 方法一: 如果不行,则进行下一步: 尝试在project St ...
- jetbrain 全套激活
关于 jetbrain 专业版激活的教程很多,发现很多实际操作不太友好,本人亲测可激活经理 1.下载 ja-ja-netfilter-all https://github.com/byebai95/j ...
- Linux下查看全部的环境变量
在Windows下,查看环境变量的命令是:set,这个命令会输出系统当前的环境变量. ... Linux查看环境变量使用env命令显示所有的环境变量 $ env
- redis中获取区间数据及获取总条数
import redis REDIS_ITEMS_HOST: str = host REDIS_ITEMS_PASSWORD: str = pwd REDIS_ITEMS_DB: int = 4 #查 ...
- axios使用总结
一.请求配置 // 引入import axios from 'axios';import qs from 'qs';this.$axios({ method:"get", // g ...
- Linux系统管理实战-进程管理
进程管理 了解进程 状态/生命周期 查看进程 管理进程 kill killall pkill 进程的调度 进程的nice 了解进程状态/生命周期 什么是进程? 进程的状态? 进程的生命周期? 查看进程 ...
- 【转载】python:获取当前目录、上层目录路径
import os print("===获取当前文件目录===")# 当前脚本工作的目录路径print(os.getcwd())# os.path.abspath()获得绝对路径p ...
- C语言初级阶段8——预处理
C语言初级阶段8--预处理 预定义符号 1.概念:预处理是编译之前做的一些事. 2.常用的预定义符号: 注意:: (1)-(4)的格式占位符都用%是,如:printf("%s",D ...
- Crypto入门 (四)不仅仅是Morse(Morse+Bacon)
前言: 前面我们刚刚学过了解Morsecode,现在我们将继续学习 不仅仅是Morse: 题目:--/.-/-.--/..--.-/-..././..--.-/..../.-/...-/./..--. ...