首頁 > 後端開發 > C++ > 如何產生數組的所有唯一排列,包括處理重複元素?

如何產生數組的所有唯一排列,包括處理重複元素?

Patricia Arquette
發布: 2024-12-27 22:53:11
原創
366 人瀏覽過

How to Generate All Unique Permutations of an Array, Including Handling Repeated Elements?

數組的排列

數組的排列是以不同順序排列數組元素的所有可能方式。例如,陣列[1, 2, 3] 具有以下排列:

  • [1, 2, 3]
  • [1, 3, 2]
  • [ 2, 1, 3]
  • [2, 3, 1]
  • [3, 1, 2]
  • [3, 2, 1]

有多種演算法可以產生陣列的排列。最常見的演算法之一是遞歸演算法,它透過將新元素添加到較小數組的每個排列的末尾來產生較小數組的所有排列。

這裡是Java 中遞歸演算法的實作:

import java.util.List;

public class Permute {

    public static void main(String[] args) {
        int[] a = new int[]{3, 4, 6, 2, 1};
        permute(a, 0);
    }

    static void permute(int[] a, int k) {
        for (int i = k; i < a.length; i++) {
            java.util.Collections.swap(a, i, k);
            permute(a, k + 1);
            java.util.Collections.swap(a, i, k);
        }
        if (k == a.length - 1) {
            System.out.println(java.util.Arrays.toString(a));
        }
    }
}
登入後複製

上面的程式碼將陣列a 的所有排列列印到console.

處理重複元素

上面的遞歸演算法無法正確處理重複元素。例如,如果陣列 a 包含重複的元素,那麼演算法將產生重複的排列。

為了處理重複的元素,我們可以使用稱為堆演算法的不同演算法。 Heap 演算法透過迭代交換數組的兩個元素來產生數組的所有排列。

這是 Heap 演算法在 Java 中的實作:

import java.util.List;

public class Permute {

    public static void main(String[] args) {
        int[] a = new int[]{3, 3, 4, 4, 6, 2, 1};
        permute(a, 0);
    }

    static void permute(int[] a, int k) {
        if (k == a.length - 1) {
            System.out.println(java.util.Arrays.toString(a));
        } else {
            for (int i = k; i < a.length; i++) {
                if (i == k || a[i] != a[k]) {
                    java.util.Collections.swap(a, i, k);
                    permute(a, k + 1);
                    java.util.Collections.swap(a, i, k);
                }
            }
        }
    }
}
登入後複製

上面的程式碼列印所有唯一的排列將陣列 a 發送到控制台。

以上是如何產生數組的所有唯一排列,包括處理重複元素?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板