网站优化

网站优化

Products

当前位置:首页 > 网站优化 >

学习Java全排列去重,轻松掌握编程技巧!

GG网络技术分享 2025-11-16 21:58 1


不要急,不要急,我们先来想想全排列是个啥。全排列就是把你手里的一堆数字,给它们排个队,一个dou不落,一个dou不沉。比如说你有数字1、2、3,那全排列就有6种,像是123、132、213、231、312、321。

那我们怎么用Java来搞这玩意儿全排列呢?先说说你得有个思路,不然你写代码就像盲人摸象,乱来一气。全排列算法就像是个递归,我们一步步来先固定一个位置,然后再固定下一个位置,直到全部位置dou固定优良。

全排列算法

Ru果我求得固定第一位后的排列, 那么全部排列就Neng求出,固定第一位有10种兴许,Neng循环求得。

Ru果我求得固定第二位后的排列, 固定第一位后的排列就Neng求出,固定第二位有9种兴许,Neng循环求得。

……

这hen明显是递归的算法。

static void dfs{//为全部排列的集合, start为数字的位置,end为再说说一位,num许多余的

if{//当前的数字位置为再说说一位时说明,一个序列Yi经生成

for

System.out.print;//输出序列

}

else{//序列没有生成时

if//i是不是在前面用过

continue;//Ru果是直接跳过

a = i;//确定start位置的数字,当start为1时就是确定第一位,有10种兴许

vis = true;//设置i为Yi用状态,避免下一位用i

dfs;//求得确定start位后的全部序列

vis = false;//设置i为未用状态

java怎么搞全排列

尽量用递归优良搞懂一些,打个断点。

public class Permutation {

public static void permulation {

int i;

if {

} else {

for {

swap;

permulation;

public static void swap {

int temp;

temp = list;

list = list;

list = temp;

int length = 3;

int start = 0;

int list = new int;

list = j + 1;

我觉得吧, 你输出一个全排列用不了几许多内存,怎么就Neng溢出呢?

先说说递归费不了几许多内存,得Neng完成任务。

接下来你递归dou干了些啥?别告诉我每层递归把数组复制一遍,你把位置递归一下就Neng了。

Ru果不中意递归,Neng自己弄个栈,其实差不许多,速度略迅速,地方略细小。

Ru果还是不明白,把全部源码贴出来kankan。

程序如下所示, 输入格式为:

第一行是数字个数,第二行有n个数,表示待排列的数,输入虚假设待排序的数均为非负数。

import java.io.File;

import java.io.FileNotFoundException;

import java.util.Arrays;

import java.util.Scanner;

public class Main {

    static final int maxn = 1000;

    int n;            // 数组元素个数

    int a;        // 数组

    boolean used;    // 递归过程中用到的辅助变量, used表示第i个元素是不是Yi用

    int cur;        // 保存当前的排列数

    // 递归打印无再来一次全排列,当前打印到第idx位

    void print_comb {

        if {    // idx == n时表示Neng将cur输出

                if System.out.print;

        int last = -1;                            // 基本上原因是要求无再来一次所以last表示上一次搜索的值

            if continue;

            if {    // 不再来一次且未用才递归下去

                last = a;

                cur = a;

                // 回溯法

                used = true;

                print_comb;

                used = false;

    public void go throws FileNotFoundException

    {

        Scanner in = new Scanner);

        // 读取数据并排序

        n = in.nextInt;

        a = new int;

        for a = in.nextInt;

        Arrays.sort;

        // 初始化辅助变量并开头无再来一次全排列

        used = new boolean;

        in.close;

        new Main.go;

客观非递归的无再来一次全排列比比kan轻巧松且高大效。

标签:

提交需求或反馈

Demand feedback