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

DeepSeek LeetCode 3700. 锯齿形数组的总数 II Java实现

题目分析

LeetCode 3700 是 3699 的困难版本。

两题核心逻辑相同,但数据范围差异巨大:

· 3699 (I):3 ≤ n ≤ 2000,1 ≤ l < r ≤ 2000 → 可直接 DP
· 3700 (II):3 ≤ n ≤ 10⁹,1 ≤ l < r ≤ 75 → n 极大,需用矩阵快速幂加速

核心思路

沿用 3699 的 DP 状态:

· up[j]:以值 j 结尾且最后一步为上升的方案数
· down[j]:以值 j 结尾且最后一步为下降的方案数

长度为 1 时:up[j] = down[j] = 1

转移(添加一个新元素):

· newUp[x] = sum(down[0..x-1]) — 前一步下降且值 < x
· newDown[x] = sum(up[x+1..m-1]) — 前一步上升且值 > x

将 up 和 down 拼接成向量,转移是线性变换,用矩阵快速幂计算 n-1 次转移。

复杂度

· 时间:O(m³ · log n),m = r-l+1 ≤ 75
· 空间:O(m²)

Java实现

```java
class Solution {
private static final int MOD = 1_000_000_007;

public int zigZagArrays(int n, int l, int r) {
int m = r - l + 1; // 值域大小,≤ 75
int size = 2 * m; // up + down 拼接

// 构建转移矩阵 T (size x size)
long[][] T = new long[size][size];
for (int i = 0; i < m; i++) {
// newUp[i] = sum(down[0..i-1])
for (int j = 0; j < i; j++) {
T[i][m + j] = 1; // 第 i 行,down[j] 列
}
// newDown[i] = sum(up[i+1..m-1])
for (int j = i + 1; j < m; j++) {
T[m + i][j] = 1; // 第 m+i 行,up[j] 列
}
}

// 初始向量 v:长度为 1 时,up 和 down 全为 1
long[] v = new long[size];
for (int i = 0; i < size; i++) {
v[i] = 1;
}

// 计算 T^(n-1) * v
long[][] power = matrixPow(T, n - 1);
long[] result = matrixMulVec(power, v);

// 答案 = sum(up) + sum(down)
long ans = 0;
for (long val : result) {
ans = (ans + val) % MOD;
}
return (int) ans;
}

// 矩阵快速幂
private long[][] matrixPow(long[][] base, int exp) {
int n = base.length;
long[][] res = new long[n][n];
for (int i = 0; i < n; i++) {
res[i][i] = 1;
}
while (exp > 0) {
if ((exp & 1) == 1) {
res = matrixMul(res, base);
}
base = matrixMul(base, base);
exp >>= 1;
}
return res;
}

// 矩阵乘法 (取模)
private long[][] matrixMul(long[][] A, long[][] B) {
int n = A.length;
long[][] C = new long[n][n];
for (int i = 0; i < n; i++) {
for (int k = 0; k < n; k++) {
if (A[i][k] == 0) continue;
long aik = A[i][k];
for (int j = 0; j < n; j++) {
C[i][j] = (C[i][j] + aik * B[k][j]) % MOD;
}
}
}
return C;
}

// 矩阵 × 向量 (取模)
private long[] matrixMulVec(long[][] A, long[] v) {
int n = A.length;
long[] res = new long[n];
for (int i = 0; i < n; i++) {
long sum = 0;
for (int j = 0; j < n; j++) {
sum = (sum + A[i][j] * v[j]) % MOD;
}
res[i] = sum;
}
return res;
}
}
```

示例验证

示例 1:n=3, l=4, r=5 → 输出 2([4,5,4] 和 [5,4,5])

示例 2:n=3, l=1, r=3 → 输出 10

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

相关文章:

  • CC26x0/CC13x0 Bootloader实战:UART/SSI双接口协议与12大核心命令详解
  • C++23 std::expected:类型安全的错误处理新范式
  • 保定水电改造哪家施工规范 - 中媒介
  • TI AM62L WKUP_PLL0时钟系统配置详解与实战
  • YOLOv11车辆检测系统:优化策略与工程实践
  • 【毕业设计】基于 Django 的二手电子产品发布交易系统 轻量化二手电子设备交易与信息展示平台(源码+文档+远程调试,全bao定制等)
  • 应用级灾备 | 丰富的容灾能力之非结构化数据容灾!
  • 【Qt + OpenCASCADE】实现 SolidWorks 风格的装配树(附完整代码)
  • 百度网盘SVIP会员获取与下载加速全攻略
  • 中小电商如何用AI客服降本增效?
  • Python离线安装全攻略:从依赖解析到编译优化的避坑实践
  • Keep It 2.7.10:Mac专业笔记工具的功能解析与技术实现
  • 元初混沌 6G 全域通感一体化体系架构 第一卷 第七十一篇 不同链路流速差异化时延对齐方案
  • AM62L CBASS模块寄存器实战:从安全配置到总线错误调试
  • Agent Skills 实战第二课:先别写规格,用 /grill-with-docs 把需求问到底
  • SQL之数据更新
  • Bielik.ai开源大语言模型:波兰语优化与多语言部署实践
  • A-VI-5 ;VESSK
  • 基于AI视觉的零售智能防损系统设计与实践
  • springboot餐饮管理系统
  • 2026年7月整厂设备回收厂家找哪家,闲置电线电缆回收/库存电子料回收/整厂淘汰设备回收,整厂设备回收公司哪家强 - 品牌推荐师
  • AI智能体工作流:从自动化到自主决策的技术跃迁
  • TI CC32xx相机接口与PRCM电源管理API深度解析与实战
  • ROS 2 Jazzy 接入 A2M7 激光雷达实战:从电机不转、CH340 错码到 25 Hz 稳定 /scan
  • C++循环控制:break与continue的精准应用与算法实战
  • 2026 年当下,大邑比较好的膜结构张拉膜景观棚哪家质量好优质厂家哪家权威,别再踩坑!膜结构棚的隐形质量标准曝光-豪睿膜结构 - 行业甄选官
  • 大模型系统实战:从理论到落地的技术演进与挑战
  • 算法:贪心算法
  • 大模型能力扩展实战:长文本处理与多智能体协作
  • 软物理信息神经网络在传热问题中的工程实践