全排列这个问题,几乎是面试必问的问题,考察面试者递归,逻辑分析问题的能力
笔者在10年看谭浩强的c语言的时候,就接触过这个算法,只可惜那时候老师并没有严格让我们去实现
自己学习的时候也偏注重语法的理解,对于复杂算法学习还是不深究
光阴如梭
一晃眼,10年过去了,我已经为人父,经历很多项目,越来越觉得算法,时间复杂度是程序员的分水岭,特别是进大厂
资质驽钝,但知骐骥一跃,不能十步;驽马十驾,功在不舍
刷leetcode,报算法班,一个人关在家里,死磕算法
于是有了这次,一次性写出来的体验
说说全排列的思路:本质是固定一个数,然后对剩余的数递归调用进行全排列,比如这里固定数字1,对2-6进行全排列
我们写一个交换函数,然后递归调用,再换回来
https://www.bilibili.com/video/av9830088?from=search&seid=5967589139650667616
有兴趣的可以看看b站的这个
// // main.cpp // 2112 // // Created by prefer_shan on 2020/4/11. // Copyright © 2020 pipi. All rights reserved. // #include <stdio.h> void swap(int a[],int i,int j) { int tmp = a[i]; a[i] = a[j]; a[j] = tmp; } void printAwary(int a[],int n) { for(int i=0;i<n;i++) { printf("%d ",a[i]); } printf("\n"); } void prem(int a[], int p ,int q) { if(p ==q) { printAwary(a,q+1); } for(int i=p;i<=q;i++) { swap(a,p,i); prem(a,p+1,q); swap(a,p,i); } } int main(){ int a[] = {1,2,3,4}; int size = sizeof(a)/sizeof(a[0]); prem(a,0,size-1); return 0; }