当前位置: 首页 > news >正文

千问 LeetCode 1359.有效的快递序列数目 public int countOrders(int n)

这道题要求计算 n 个订单所有有效的收件/配送序列数目,其中每个订单的配送(Delivery)必须在其收件(Pickup)之后。

这是一个经典的组合数学问题,可以通过递推的方法来解决。

💡 解题思路

我们可以从 n-1 个订单的合法序列,推导出 n 个订单的合法序列数量。

1. 基础情况:当 n=1 时,只有一个订单,序列只能是 (P1, D1),所以只有 1 种有效序列。
2. 递推关系:假设我们已经有了 n-1 个订单的所有合法序列。现在要加入第 n 个订单的 (Pn, Dn)。
* n-1 个订单会形成一个长度为 2 * (n-1) 的序列。
* 这个序列中有 2 * (n-1) + 1 个“空位”可以用来插入新的元素(包括序列开头、结尾和任意两个元素之间)。
* 我们需要将 Pn 和 Dn 放入这些空位中,并且保证 Pn 在 Dn 之前。
* 我们可以这样考虑:
* 首先放置 Pn。它有 2 * (n-1) + 1 个位置可选。
* 假设 Pn 已经放在了某个位置,那么 Dn 只能放在 Pn 之后的空位里。
* 如果 Pn 放在第 1 个空位,Dn 有 2 * (n-1) + 1 个后续空位可选。
* 如果 Pn 放在第 2 个空位,Dn 有 2 * (n-1) 个后续空位可选。
* ...
* 如果 Pn 放在最后一个空位,Dn 只有 1 个后续空位可选。
* 因此,对于每一个 n-1 订单的序列,插入第 n 个订单的总方法数是:
(2n-1) + (2n-2) + ... + 1
* 这是一个等差数列求和,结果为 (2n-1) * 2n / 2 = n * (2n-1)。

所以,我们得到了递推公式:f(n) = f(n-1) * n * (2n - 1)。

💻 Java 代码实现

根据上面的递推公式,我们可以写出简洁的递归或迭代代码。

方法一:递归实现

class Solution {
private static final int MOD = 1000000007;

public int countOrders(int n) {
// 基础情况:1个订单只有1种序列
if (n == 1) {
return 1;
}
// 递推公式:f(n) = f(n-1) * n * (2n - 1)
// 注意使用 long 防止乘法溢出
return (int) (((long) countOrders(n - 1) * n % MOD) * (2 * n - 1) % MOD);
}
}

方法二:迭代实现 (更优)

迭代方法避免了递归的函数调用开销,效率更高。

class Solution {
public int countOrders(int n) {
long res = 1; // 使用 long 防止中间结果溢出
int MOD = 1000000007;

// 从 i=2 开始迭代计算到 n
for (int i = 2; i <= n; i++) {
// 每次乘以 i * (2*i - 1) 并取模
res = res * i % MOD;
res = res * (2 * i - 1) % MOD;
}

return (int) res;
}
}

📊 复杂度分析

* 时间复杂度:O(n)。无论是递归还是迭代,都需要进行 n 次计算。
* 空间复杂度:
* 递归方法:O(n),因为递归调用栈的深度为 n。
* 迭代方法:O(1),只使用了常数级别的额外空间。

因此,迭代方法是更优的选择。

http://www.jsqmd.com/news/631924/

相关文章:

  • 别再为找数据发愁了!手把手教你下载并预处理LandSat8-38Cloud数据集(附Python代码)
  • 终极指南:如何使用League-Toolkit提升英雄联盟游戏效率
  • DeepSeek-V4全球首发,DMXAPI聚合平台同步上线,国产AI模型迎来突破
  • STM32CubeMX实战:SPI驱动W25Q32 Flash的底层封装与数据读写
  • TRPO算法中的数学陷阱:为什么你的KL约束总失效?从理论到调参全解析
  • BLE_API嵌入式中间件:HAL抽象层设计与跨平台实践
  • 2026方底纸袋设备标杆名录:手提纸袋设备、方底纸袋机、纸袋机器、高速纸袋机、全自动纸袋机、全自动纸袋设备、卷筒纸袋机选择指南 - 优质品牌商家
  • When and Why to use Extensions -- VK_KHR_draw_indirect_count
  • Alive2 如何对包含循环的 LLVM 优化进行有界验证
  • 大一新生,初入博客,勇闯计算机专业
  • 从SORT到AB3DMOT:聊聊3D多目标跟踪中那些“老算法”的新生命力
  • 嵌入式开发-桥接模式:应用与驱动层解耦
  • 归并排序力扣题(leetcode)桓
  • 2026年口碑好的商用转轮热交换器公司哪家好 - 行业平台推荐
  • ThinkPHP 8的架构的庖丁解牛
  • Qwen3-ASR-1.7B部署教程:HTTPS反向代理配置保障Web服务安全访问
  • CSDN程序员副业图谱
  • 终极OBS多路推流插件完全指南:如何一键实现多平台同步直播
  • 彻底告别OpenClaw使用焦虑:我给他装上了“透视眼”和“批量克隆模组岳
  • ubuntu搭建k8s 1.35版本
  • c语言基础语法六——结构体(完结)
  • 2026年可靠文件销毁公司技术指南:海关销毁公司/电子产品销毁公司/过期食品销毁公司/饮料销毁公司/上海专业销毁公司/选择指南 - 优质品牌商家
  • 嵌入式MQTT设备注册客户端:轻量级DeviceRegistry深度解析
  • 2026年Q2丙烯酸脂肪族聚氨酯面漆标杆名录:环氧富锌底漆、耐高温漆200℃-500℃、聚氯乙烯防腐漆、醇酸调和漆选择指南 - 优质品牌商家
  • SEN66多参数空气质量传感器嵌入式集成指南
  • AI开发-python-langchain框架(--excle文档加载 )乇
  • AxThread:嵌入式轻量级异步任务调度库
  • 深入理解Harness Engineering:当AI Agent让代码不再稀缺,工程师的价值在哪里?
  • npm 从入门到精通(三):再进阶,掌握版本管理、脚本系统与包发布
  • # 016、AutoSAR CP操作系统(OS)配置与任务调度:那个让我加班到凌晨三点的调度死锁