好的这道题用 JavaScript 实现核心思路和之前一样但 JS 的语法更灵活代码可以写得很简洁。下面给出两种主流实现推荐第二种空间更优且代码最短。解法一枚举 j 和 kO(n²) 空间AC/*** param {number[]} nums* return {number}*/var countQuadruplets function(nums) {const n nums.length;// large[k][x] 表示在索引大于 k 的元素中值大于 x 的个数const large Array.from({ length: n }, () new Array(n 1).fill(0));// 预处理 large 数组从后往前for (let k n - 2; k 2; k--) {// 复制上一轮的结果for (let x 0; x n; x) {large[k][x] large[k 1][x];}// 对于 nums[k1] 这个值所有比它小的数 x其右侧的大数个数都 1for (let x nums[k 1] - 1; x 0; x--) {large[k][x];}}let res 0;const small new Array(n 1).fill(0); // small[x] 表示当前 j 左边值小于 x 的个数for (let j 1; j n - 2; j) {// 更新 small 数组for (let x nums[j - 1] 1; x n; x) {small[x];}// 固定 j遍历 kfor (let k j 1; k n - 1; k) {if (nums[j] nums[k]) {res large[k][nums[j]] * small[nums[k]];}}}return res;};解法二枚举 l动态维护O(n) 空间推荐这是最简洁高效的写法空间复杂度只有 O(n)。/*** param {number[]} nums* return {number}*/var countQuadruplets function(nums) {const n nums.length;let ans 0;const cnt3 new Array(n).fill(0); // cnt3[j] 表示以 j 为中间元素的三元组个数// 枚举 l四元组最后一个元素for (let l 0; l n; l) {let cnt2 0; // 记录当前 (k, l) 二元组的个数// 从 l-1 向左枚举 jfor (let j l - 1; j 0; j--) {if (nums[j] nums[l]) {// j 作为 3之前累积的 cnt3[j] 就是 (i, j, k) 的个数ans cnt3[j];} else {// j 作为 2可以形成新的 (k, l) 二元组cnt2;// 更新 cnt3[j]以 j 为 3 的三元组个数增加 cnt2cnt3[j] cnt2;}}}return ans;};解法三枚举 l用 Map 优化更符合 JS 风格如果你更喜欢用 Map 而不是数组var countQuadruplets function(nums) {const n nums.length;let ans 0;const cnt3 new Map(); // 用 Map 存储 cnt3for (let l 0; l n; l) {let cnt2 0;for (let j l - 1; j 0; j--) {if (nums[j] nums[l]) {ans cnt3.get(j) || 0;} else {cnt2;cnt3.set(j, (cnt3.get(j) || 0) cnt2);}}}return ans;};测试用例// 示例 1console.log(countQuadruplets([1,3,2,4,5])); // 输出: 2// 示例 2console.log(countQuadruplets([1,2,3,4])); // 输出: 0// 额外测试console.log(countQuadruplets([1,4,2,3,5])); // 输出: 1 (i0,j1,k2,l4)总结解法 时间复杂度 空间复杂度 代码行数枚举 j, k O(n²) O(n²) ~30行枚举 l动态维护 O(n²) O(n) ~20行枚举 lMap版 O(n²) O(n) ~20行推荐使用解法二空间最优代码简洁面试中写这个版本最加分。