java全排列,java全排列去重

本文目錄一覽:

Java數組的全排列,裡面布爾類型的數組vis[ ],在遞歸算法里起了什麼作用,遞歸那塊理解不了,求詳細解答

不要急於看代碼,你心理要知道全排列的思路,不注重思路是很多程序員易犯的錯誤。

全排列算法:

如果我求得固定第一位後的排列,那麼全部排列就可以求出,固定第一位有10種可能,可以循環求得。

如果我求得固定第二位後的排列,固定第一位後的排列就可以求出,固定第二位有9種可能,可以循環求得。

。。。

如果我求得固定第10位後的排列,固定第9位後的排列就可以求出,固定第10位有1種可能,可以循環求得。

這很明顯是遞歸的算法。

static void dfs(int start,int end,int num){//為全部排列的集合,start為數字的位置,end為最後一位,num多餘的

if(start==end){//當前的數字位置為最後一位時,說明,一個序列已經生成

for(int i=1;iend;i++)

System.out.print(a[i]+” “);//輸出序列

System.out.println();

}

else{//序列沒有生成時

for(int i=1;iend;i++){

if(vis[i])//i是否在前面使用過

continue;//如果是直接跳過

a=i;//確定start位置的數字,當start為1時就是確定第一位,有10種可能

vis[i]=true;//設置i為已使用狀態,避免下一位使用i

dfs(start+1,end,num);//求得確定start位後的全部序列

vis[i]=false;//設置i為未使用狀態

}

}

java怎麼搞全排列

盡量用遞歸好理解一些,打個斷點

public class Permutation {

public static void permulation(int[] list, int start, int length) {

int i;

if (start == length) {

for (i = 0; i length; i++)

System.out.print(list[i] + ” “);

System.out.println();

} else {

for (i = start; i length; i++) {

swap(list, start, i);

permulation(list, start + 1, length);

swap(list, start, i);

}

}

}

public static void swap(int[] list, int start, int i) {

int temp;

temp = list;

list = list[i];

list[i] = temp;

}

public static void main(String[] args) {

int length = 3;

int start = 0;

int list[] = new int[length];

for (int j = 0; j length; j++)

list[j] = j + 1;

permulation(list, start, length);

}

}

如何用java輸出一個數組的全排列?不能用遞歸,用遞歸的話,很快就內存溢出了!

我覺得吧,你輸出一個全排列用不了多少內存,怎麼就能溢出呢?

首先,遞歸費不了多少內存,應該可以完成任務。

其次,你遞歸都幹了些什麼?別告訴我每層遞歸把數組複製一遍,你把位置遞歸一下就可以了。

如果不喜歡遞歸,可以自己弄個棧,其實差不多,速度略快,空間略小。

如果還是不明白,把全部源碼貼出來看看。

java中,用遞歸方法求n個數的無重複全排列,n=3。

程序如下所示,輸入格式為:

5

3 1 2 1 2

第一行是數字個數,第二行有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]表示第i個元素是否已使用

    int[] cur;        // 保存當前的排列數

    

    // 遞歸打印無重複全排列,當前打印到第idx位

    void print_comb(int idx) {

        if(idx == n) {    // idx == n時,表示可以將cur輸出

            for(int i = 0; i  n; ++i) {

                if(i  0) System.out.print(” “);

                System.out.print(cur[i]);

            }

            System.out.println();

        }

        

        int last = -1;                            // 因為要求無重複,所以last表示上一次搜索的值

        for(int i = 0; i  n; ++i) {

            if(used[i]) continue;

            

            if(last == -1 || a[i] != last) {    // 不重複且未使用才遞歸下去

                last = a[i];

                cur[idx] = a[i];

                

                // 回溯法

                used[i] = true;

                print_comb(idx + 1);

                used[i] = false;

            }

        }

    }

    

    public void go() throws FileNotFoundException

    {

        Scanner in = new Scanner(new File(“data.in”));

        // 讀取數據並排序

        n = in.nextInt();

        a = new int[n];

        for(int i = 0; i  n; ++i) a[i] = in.nextInt();

        Arrays.sort(a);

        

        // 初始化輔助變量並開始無重複全排列

        cur = new int[n];

        used = new boolean[n];

        for(int i = 0; i  n; ++i) used[i] = false;

        print_comb(0);

        in.close();

    }

    

    public static void main(String[] args) throws FileNotFoundException{

        new Main().go();

    }

}

客觀來說,非遞歸的無重複全排列比較簡單且高效。

原創文章,作者:WEPMM,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/324988.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
WEPMM的頭像WEPMM
上一篇 2025-01-13 13:23
下一篇 2025-01-13 13:23

相關推薦

  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論