当前位置:首页 > JavaScript

js 实现组合

2026-04-06 22:13:20JavaScript

实现组合的基本概念

组合是从一组元素中选出若干元素,不考虑顺序。例如从数组 [1, 2, 3] 中选出 2 个元素,组合结果为 [[1, 2], [1, 3], [2, 3]]

递归实现组合

递归是解决组合问题的经典方法。通过逐步构建组合,每次选择一个元素后,在剩余元素中继续选择。

function combinations(arr, k) {
  const result = [];

  function backtrack(start, current) {
    if (current.length === k) {
      result.push([...current]);
      return;
    }

    for (let i = start; i < arr.length; i++) {
      current.push(arr[i]);
      backtrack(i + 1, current);
      current.pop();
    }
  }

  backtrack(0, []);
  return result;
}

// 示例
console.log(combinations([1, 2, 3], 2)); // [[1, 2], [1, 3], [2, 3]]

迭代实现组合

迭代方法利用栈模拟递归过程,避免递归可能导致的堆栈溢出问题。

function combinationsIterative(arr, k) {
  const result = [];
  const stack = [{ index: 0, current: [] }];

  while (stack.length > 0) {
    const { index, current } = stack.pop();

    if (current.length === k) {
      result.push([...current]);
      continue;
    }

    for (let i = index; i < arr.length; i++) {
      current.push(arr[i]);
      stack.push({ index: i + 1, current: [...current] });
      current.pop();
    }
  }

  return result;
}

// 示例
console.log(combinationsIterative([1, 2, 3], 2)); // [[1, 2], [1, 3], [2, 3]]

使用生成器实现组合

生成器可以按需生成组合,适用于大数据集或需要惰性计算的场景。

function* combinationsGenerator(arr, k, start = 0, current = []) {
  if (current.length === k) {
    yield [...current];
    return;
  }

  for (let i = start; i < arr.length; i++) {
    current.push(arr[i]);
    yield* combinationsGenerator(arr, k, i + 1, current);
    current.pop();
  }
}

// 示例
const gen = combinationsGenerator([1, 2, 3], 2);
console.log([...gen]); // [[1, 2], [1, 3], [2, 3]]

处理重复元素的组合

如果输入数组包含重复元素,需要去重处理。

js 实现组合

function combinationsWithDup(arr, k) {
  arr.sort((a, b) => a - b);
  const result = [];

  function backtrack(start, current) {
    if (current.length === k) {
      result.push([...current]);
      return;
    }

    for (let i = start; i < arr.length; i++) {
      if (i > start && arr[i] === arr[i - 1]) continue;
      current.push(arr[i]);
      backtrack(i + 1, current);
      current.pop();
    }
  }

  backtrack(0, []);
  return result;
}

// 示例
console.log(combinationsWithDup([1, 2, 2, 3], 2)); // [[1, 2], [1, 3], [2, 2], [2, 3]]

组合的应用场景

组合算法广泛应用于排列组合问题、子集生成、密码破解、游戏开发等领域。例如在扑克游戏中计算手牌组合,或在数据分析中生成特征组合。

标签: 组合js
分享给朋友:

相关文章

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 使用JavaScript实现拖拽功能需要监听鼠标事件,包括mousedown、mousemove和mouseup。以下是实现的基本逻辑: const draggableEleme…

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previo…

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

js 实现拖拽

js 实现拖拽

实现拖拽的基本步骤 在JavaScript中实现拖拽功能需要监听几个关键事件:mousedown、mousemove和mouseup。以下是实现的基本逻辑。 监听目标元素的mousedown事件,记…

js 实现图片轮播

js 实现图片轮播

基础实现方案 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS负责样式布局,JavaScript处理轮播逻辑。 <div class="…