全排列这个问题,几乎是面试必问的问题,考察面试者递归,逻辑分析问题的能力
笔者在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;
}
版权声明:本文为pengfeicfan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。