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

潜山云建站网站建设推广的公司

潜山云建站网站建设,推广的公司,十大计算机培训机构排名,mac系统的免费wordpress题目描述 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按任意顺序返回答案。 示例 示例 1 输入: n 4, k 2输出: [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]示例 2 输入: n 1, k …

题目描述

给定两个整数 nk,返回范围 [1, n] 中所有可能的 k 个数的组合。

  • 你可以按任意顺序返回答案。

示例

示例 1

输入

n = 4, k = 2

输出

[[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]
示例 2

输入

n = 1, k = 1

输出

[[1]]

解题思路

1. 回溯法

回溯法是解决组合问题的经典方法,通过递归构建所有可能的组合。

算法步骤

  1. 定义一个函数 backtrack(start, path),其中 start 表示搜索的起点,path 是当前构建的组合。
  2. 如果当前组合 path 的长度等于 k,将其加入结果集中。
  3. 遍历从 startn 的所有数字:
    • 将当前数字加入组合。
    • 递归构建下一个数字的组合。
    • 回溯,移除当前数字。

回溯法的时间复杂度是 O(C(n, k)),其中 C ( n , k ) = n ! k ! ( n − k ) ! C(n, k) = \frac{n!}{k!(n-k)!} C(n,k)=k!(nk)!n!


实现代码

C语言实现
#include <stdio.h>
#include <stdlib.h>// 动态数组结构
typedef struct {int** data;int size;int capacity;
} Array;void initArray(Array* arr, int capacity) {arr->data = (int**)malloc(sizeof(int*) * capacity);arr->size = 0;arr->capacity = capacity;
}void addToArray(Array* arr, int* combination, int k) {if (arr->size == arr->capacity) {arr->capacity *= 2;arr->data = (int**)realloc(arr->data, sizeof(int*) * arr->capacity);}arr->data[arr->size] = (int*)malloc(sizeof(int) * k);for (int i = 0; i < k; i++) {arr->data[arr->size][i] = combination[i];}arr->size++;
}void backtrack(int n, int k, int start, int* combination, int combSize, Array* result) {if (combSize == k) {addToArray(result, combination, k);return;}for (int i = start; i <= n; i++) {combination[combSize] = i;backtrack(n, k, i + 1, combination, combSize + 1, result);}
}int** combine(int n, int k, int* returnSize, int** returnColumnSizes) {Array result;initArray(&result, 16);int* combination = (int*)malloc(sizeof(int) * k);backtrack(n, k, 1, combination, 0, &result);*returnSize = result.size;*returnColumnSizes = (int*)malloc(sizeof(int) * result.size);for (int i = 0; i < result.size; i++) {(*returnColumnSizes)[i] = k;}free(combination);return result.data;
}int main() {int n = 4, k = 2;int returnSize;int* returnColumnSizes;int** combinations = combine(n, k, &returnSize, &returnColumnSizes);printf("Combinations:\n");for (int i = 0; i < returnSize; i++) {printf("[");for (int j = 0; j < returnColumnSizes[i]; j++) {printf("%d", combinations[i][j]);if (j < returnColumnSizes[i] - 1) printf(", ");}printf("]\n");free(combinations[i]); // 释放每个组合的内存}free(combinations); // 释放结果数组的内存free(returnColumnSizes); // 释放列大小数组的内存return 0;
}

代码解析

  1. 动态数组

    • 使用 Array 结构来动态存储组合结果。
    • initArray 初始化数组,addToArray 动态增加组合。
  2. 回溯函数

    • backtrack 函数递归构建所有可能的组合。
    • 使用 start 控制数字范围,避免重复组合。
  3. 主函数

    • combine 是主函数,调用回溯并返回结果。
    • 动态分配 returnColumnSizes 以存储每个组合的列数。
  4. 内存管理

    • 在主函数中释放动态分配的内存,避免内存泄漏。

时间复杂度和空间复杂度

  • 时间复杂度

    • 回溯构造所有组合的复杂度是 O(C(n, k)),即 n ! k ! ( n − k ) ! \frac{n!}{k!(n-k)!} k!(nk)!n!
  • 空间复杂度

    • 临时数组 combination 的空间复杂度为 O(k)
    • 存储结果的空间复杂度为 O ( C ( n , k ) ⋅ k ) O(C(n, k) \cdot k) O(C(n,k)k)
http://www.mnyf.cn/news/43416.html

相关文章:

  • 外国做爰网站百度大数据分析平台
  • 二级域名网站建设规范软文推广页面
  • 服装网站开发项目计划书seo查询网站是什么
  • 男女真实做性视频网站百度推广营销怎么做
  • 网站模南京网站制作
  • 成都网站建设zmcmsnba今日最新消息
  • 沈阳设计培训网站建设seo日常工作
  • wordpress 公众号 采集官网seo哪家公司好
  • 河北网站建设搭建百度搜索一下
  • 盐地网站建设公司百度站长资源平台
  • seo网站建设百度业务员联系电话
  • 沧州网站营销推广好的建站网站
  • 给网站做sitemap文件谷歌关键词排名查询工具
  • 成都网站营销seo电话电商运营主要工作内容
  • 网站备案人有什么风险站长网站优化公司
  • 网站建设客户功能详细要求百度百家号注册
  • 一个网站两个域名百度商桥安装方法模拟搜索点击软件
  • 简述网站开发具体流程图seo的课谁讲的好
  • 如何做网站不容易被攻击世界比分榜
  • 宁波住房和城乡建设局网站最全bt搜索引擎入口
  • flash网站读条怎么做网络营销有哪几种方式
  • 榆林做网站的公司营销型网站策划
  • 百度网站做不做网络营销课程设计
  • 做网站新手流程上海seo外包公司
  • 专业网页设计哪家好重庆seo教程
  • 做衣服招临工在什么网站找百度统计怎么用
  • 做网站的公司哪好游戏推广员拉人犯法吗
  • 网站建设合同是否交纳印花税湖南正规关键词优化报价
  • 衡水市网站制作关键词首页排名优化价格
  • wordpress兑换卡密西安seo网站推广优化