DeepSeek LeetCode 2963. 统计好分割方案的数目 JavaScript实现

DeepSeek    LeetCode 2963. 统计好分割方案的数目 JavaScript实现 以下是 LeetCode 2963. 统计好分割方案的数目 的 JavaScript 实现。完整代码javascript/*** param {number[]} nums* return {number}*/var numberOfGoodPartitions function(nums) {const MOD 1000000007;const n nums.length;// 1. 记录每个数字最后一次出现的位置const lastPos new Map();for (let i 0; i n; i) {lastPos.set(nums[i], i);}// 2. 贪心扫描找出所有必须合并的块let segments 0; // 块的数量let currEnd 0; // 当前块需要覆盖到的最大右边界for (let i 0; i n; i) {// 更新当前块的右边界currEnd Math.max(currEnd, lastPos.get(nums[i]));// 如果当前位置是当前块的右边界说明找到了一个完整的块if (i currEnd) {segments;}}// 3. 计算方案数2^(segments-1) % MOD// 有 segments 块中间有 segments-1 个可选切割点let ans 1;for (let i 1; i segments; i) {ans (ans * 2) % MOD;}return ans;};测试示例javascript// 测试用例 1console.log(numberOfGoodPartitions([1, 1, 2, 2, 3, 3])); // 输出: 8// 测试用例 2console.log(numberOfGoodPartitions([1, 2, 3, 4])); // 输出: 1// 每个数字只出现一次只能整个数组作为一块2^(1-1)1// 测试用例 3console.log(numberOfGoodPartitions([1, 2, 1, 2, 3])); // 输出: 2// [1,2,1,2] 必须在一起[3]单独所以 2^(2-1)2算法流程详解1. 记录最后位置遍历数组用 Map 记录每个数字最后一次出现的下标。2. 贪心合并块维护 currEnd 表示当前块必须到达的最远位置。遍历过程中不断更新 currEnd max(currEnd, lastPos[nums[i]])。当 i currEnd 时说明当前块已完整可以切分segments。3. 计算结果segments 是最终必须分成的块数中间有 segments - 1 个切割点。每个切割点可以选择切或不切所以总方案数为 2^(segments-1)。复杂度分析· 时间复杂度O(n)· 第一次遍历记录最后位置O(n)· 第二次遍历计算块数O(n)· 计算幂次O(segments) ≤ O(n)· 空间复杂度O(n)· Map 存储每个数字的最后位置关键点说明· JavaScript 中取模运算使用 % 运算符· 使用 BigInt 可以处理超大数字但本题 2^(n-1) 在取模范围内普通 Number 即可因为每次乘 2 后都取模· 如果 segments 1循环不执行直接返回 1这个解法与 Java 版本逻辑完全一致只是语法上的差异。