老子的全排列呢

链接

本题要求输出1-8的全排列,手动输入完全不现实,本题可采用回溯法,本质还是递归 不妨以1-3为例,先构建一个数组{1,2,3}

要实现全排列,就是给数组的每个元素排序 我们可用一个标记数组used{0,0,0},和用于输出的数组path 进入循环

1.used={1,0,0} path={1}第一层就放入第一个数接着进入第二层

2.used=(1,1,0)path={1,2}

3used={1,1,1}path={1,2,3}此时达到输出要求,可以加一个条件,即path. size()=3时,输出

输出完成一步一步退出循环,回到第二层

2.used={1,0,1}path={1,3}

3.used={1,1,1}path={1,3,2}输出

退回第一层

1.used={0,1,0}path={2}如此进行下去

其实就是控制used为真值的位置来决定path先填入的元素

代码实现

#include<iostream>
#include<vector>
using namespace std;
void f(vector<int>& nums, vector<int>& path, vector<bool>& used) {
 	if (path.size() == nums.size()) {
 		for (int num : path) {
 			cout << num << " ";
 		}
 		cout << endl;
 		return;
 	}
 	for (int i = 0;i < nums.size();i++) {
 		if (!used[i]) {
 			used[i] = 1;
 			path.push_back(nums[i]);
 			f(nums, path, used);
 			used[i] = 0;
 			path.pop_back();
 		}
 	}
}
int main() {
 	vector<int>nums = { 1,2,3,4,5,6,7,8 };
 	vector<int>path;
 	vector<bool>used(8, false);
 	f(nums, path, used);
 	return 0;
}

时间复杂度:O(n*n!)

空间复杂度:O(n).

全部评论

相关推荐

2025-11-25 13:20
门头沟学院 Java
1、实习介绍2、手撕:有n个数,随机排列成一个最大的数,输出一个字符串,例:[3,10,24,25],输出:"3252410"3、优化一个SQL语句:SELECT&nbsp;\*&nbsp;FROM&nbsp;ordersWHERE&nbsp;user_id=123AND&nbsp;status='PAID'ORDER&nbsp;BY&nbsp;create_time&nbsp;DESCLIMIT&nbsp;10;表中字段:id,&nbsp;user_id,&nbsp;status,&nbsp;amount,&nbsp;create_time数据量:1亿条记录4、联合索引为什么按user_id、status、create_time这个顺序呢,你怎么知道数据库引擎就是按这个顺序去检索的呢,对数据库索引底层是如何做的有了解吗5、除了索引和select&nbsp;\*,还会有什么问题吗,你会怎么去解决呢6、你说到了根据user_id分表,那具体用什么策略去分表呢7、为什么选择user_id,而不用主键id,或者其他呢8、给了一段代码,用来在秒杀场景中进行减库存操作,一个stock表示库存量,一个减库存的方法,在单服务器部署场景下,代码会有什么问题吗(没加锁),怎么解决呢9、synchronized和ReentrantLock实现机制清楚吗10、下面考虑分布式部署的情况,只加上面的锁,会有什么问题吗11、那这里的取值操作需要加锁吗,还是说只有减库存需要加锁12、如果让你设计一个分布式锁,你会考虑哪些方面13、场景:设计一个类似微薄的点赞和取消点赞功能,需要设计一个api的接口实现这个功能,给出他的请求方法和URL,同时设计表,来存储点赞数据。主要实现三个业务功能:存储点赞信息,对这些信息做统计,让用户能看到自己的点赞14、如果需要考虑一些特殊场景,保证这个接口的安全,比如用户身份鉴权,恶意的流量攻击等待15、统计点赞数的逻辑如何实现,什么时候去统计比较合适16、反问聊天
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务