全排列:从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。
当m=n时所有的排列情况叫全排列。
通俗一点:比如给你一个整型数组,使用数组中的全部数字,组成的全部组合,并且和顺序有关。
比如:nums=[1,4,6]
它的全排类是:146,164,416,461,641,614。
即3的阶乘种组合数,即数学中的A(3,3)。
一般使用暴力枚举所有情况,再检查这种情况是否满足条件,满足则记录下来,进一步 *** 作。
public class FullyArranged {
public static void main(String[] args) {
int[] nums = {1, 2, 3, 4, 5, 6, 7, 8, 9};
func(nums, 0);
}
// 确认某个排列的第k位 全排列模板
public static void func(int[] arr, int k) {
if (k == nums.length) { // 全部确认
check(nums);
return;
}
// 选定第k位,
for (int i = k; i < nums.length; i++) {
int t = nums[i];
nums[i] = nums[k];
nums[k] = t;
// 移交下一层取确定k+1位
func(nums, k + 1);
// 回溯
t = nums[i];
nums[i] = nums[k];
nums[k] = t;
}
}
private static void check(int[] arr) {
//... 做一些判断
}
}
4.其他C++貌似有直接的库函数
next_permutation()
如果nums中数字重复的话,nums=[1,2,5,2],则上面算法就会枚举出重复的组合,怎么解决?
只需要在func方法的出口或者check方法里面使用Set进行去除即可!!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)