1. 程式人生 > >DFS實現排列組合

DFS實現排列組合

所謂排列,是指從給定的元素序列中依次取出元素,需要考慮取出順序。比如,取出元素3, 5,因取出順序的不同,則形成的序列{3, 5}與{5, 3}是不同的排列序列。對於長度為n的元素序列取出k個元素,則共有A(n, k)種取法。所謂組合,也是從元素序列中依次取出元素,與排列不同的是不需要考慮取出順序;因此其取法數為C(n, k)。

組合

要求給出對於序列1~n 的取出k個元素的各種取法。採用DFS模擬組合時,可看做節點i與節點j(j = i+1, … , n)都相連線,然後DFS遍歷整張有向圖,程式碼實現如下:

public List<List<Integer>> combine(int n, int k) {
    List<List<Integer>> result = new ArrayList<>();
    if (n <= 0 || n < k) {
        return result;
    }
    List<Integer> tmp = new ArrayList<>();
    dfs(n, k, 1, tmp, result);
    return result;
}

// DFS for combination
private void dfs(int n, int k, int start,
                 List<Integer> tmp, List<List<Integer>> result) {
    if (tmp.size() == k) {
        result.add(new ArrayList<Integer>(tmp));
        return;
    }
    for (int i = start; i <= n; i++) {
        tmp.add(i);
        dfs(n, k, i + 1, tmp, result);
        tmp.remove(tmp.size() - 1); // remove the last
    }
}

排列

DFS實現排列與組合相類似,唯一不同之處在於,節點i與其他所有節點都連線。因此,所構造的圖是一個完全連通圖。DFS實現排列如下:

public List<List<Integer>> permute(int[] nums) {
    List<List<Integer>> result = new ArrayList<>();
    if (nums.length == 0) {
        return result;
    }
    List<Integer> tmp = new ArrayList<>();
    dfs(nums, tmp, result);
    return result;
}

// DFS for permutation
private void dfs(int[] nums, List<Integer> tmp,
                 List<List<Integer>> result) {
    int n = nums.length;
    if (tmp.size() == n) {
        result.add(new ArrayList<>(tmp));
        return;
    }
    for (int i = 0; i < n; i++) {
        // nums[i] has not been visited
        if (!tmp.contains(nums[i])) {
            tmp.add(nums[i]);
            dfs(nums, tmp, result);
            tmp.remove(tmp.size() - 1);
        }
    }
}

上述程式碼中,可以用一個visit陣列來標記節點是否被訪問,這樣優化將contains的時間複雜度從\(O(n)\)優化到\(O(1)\)

相關推薦

DFS實現排列組合

所謂排列,是指從給定的元素序列中依次取出元素,需要考慮取出順序。比如,取出元素3, 5,因取出順序的不同,則形成的序列{3, 5}與{5, 3}是不同的排列序列。對於長度為n的元素序列取出k個元素,則共有A(n, k)種取法。所謂組合,也是從元素序列中依次取出元素,與排列不同的是不需要考慮取出順序;因此其取法

python 實現排列組合

根據 ber number 數據 python Language img nat pri 1.python語言簡單、方便,其內部可以快速實現排列組合算法,下面做簡單介紹、 2.一個列表數據任意組合 2.1主要是利用自帶的庫 #_*_ coding:utf-8 _*_ #__

dfs生成排列組合模板

列舉可重複排列的模板 [cpp]  view plain  copy   #include<iostream>&

java實現排列組合實現

        在網上下載了一個實現各種演算法的文件,其中有一個實現輸出數字或者說元素所有排列順序的程式。乍一看認為很簡單但,於是想自己實現一下。但是試了試,比我想象的要困難。首先說明一下我要幹什麼:   

C語言實現排列組合

首先看遞迴實現,由於遞迴將問題逐級分解,因此相對比較容易理解,但是需要消耗大量的棧空間,如果執行緒棧空間不夠,那麼就執行不下去了,而且函式呼叫開銷也比較大。 (1) 全排列: 全排列表示把集合中元素的所有按照一定的順序排列起來,使用P(n, n) = n!表示n個元素全排列的個數。 例如:{1, 2

C#實現排列組合演算法

數學中排列組合,排列P(N,R) 其實排列實現了,組合也就實現了組合C(N,R)就是P(N,R)/P(R,R) ,比較簡單的是遞迴演算法,但考慮到遞迴的效能,下面採用了2種非遞迴的方法,程式碼如下 using System; using System.Collections

JAVA實現排列組合,簡單的一比

/** * 思路: * 遞迴,第一層把迴圈把n個數中的第i個裝入結果的第一個位置 * 把剩下的n-2個數迴圈裝入第二個位置 * 把剩下的n-3個數迴圈裝入第三個位置 * .....

c語言實現排列組合演算法問題

排列組合是演算法常用的基本工具,如何在c語言中實現排列組合呢?思路如下: 首先看遞迴實現,由於遞迴將問題逐級分解,因此相對比較容易理解,但是需要消耗大量的棧空間,如果執行緒棧空間不夠,那麼就執行不下去了,而且函式呼叫開銷也比較大。 (1) 全排列: 全排列表示把集合

輕鬆用python實現排列組合功能

#! /usr/bin/env python # -*- coding=utf-8 -*- import itertools list1 = 'abc' list2 = [] for i in range(1,len(list1)+1):    iter = itertools.combinations

深入探討:如何實現排列組合

一、引言 當你點開了這篇部落格,希望你能站在跟我一起探討的角度上來思考這個問題,那麼也許你能獲得更多的啟示 ^_^。 最近在做 LeetCode 的時候,有一道題讓我想到了另一個問題: 如何程式設計實現排列組合演算法? 也就是說,輸入 M 個元

排列組合實現

flv index ttl href 2個 crt 字符串長度 cxx ftk 排列組合的實現 數據庫環境:SQL SERVER2008R2 先說一下需求:實現1,2,3的排列組合,即123,132,213,231,312,321。 哈哈,你沒看錯,需求這是這麽短短的一句

Python 基礎 排列組合實現

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

java排列組合遞迴實現

import java.util.Scanner; public class combination { public static int k1=0; //計數k1 public static int k2=0;

排列組合的 python 實現

排列組合是數學中很基本的知識點。所謂排列,就是指從給定個數的元素中取出指定個數的元素進行排序。組合則是指從給定個數的元素中僅僅取出指定個數的元素,不考慮排序。 排列:從n個不同元素中任取m(m≤n)個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素

Python 基礎 排列組合實現

                     考慮這樣一個問題,給定一個矩陣(多維陣列,numpy.ndarray()),如何shuffle這個矩陣(也就是對其行進行全排列),如何隨機地選擇其中的k行,這叫組合,實現一種某一維度空間的切片。例如五列中選三列(全部三列的排列數),便從原有的五維空間中降維到三維空間,

排列組合_排列_程式實現

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <ti

排列組合_組合_程式實現

/* * 組合即沒有順序,以 A B C中取出任意兩個為例 * 結果為 AB AC BC 三種情況 * 實現:在有序排列的基礎上排序去重 * 有序排列的時候為: * AB AC BA BC CA CB * 先對每個進行排序: * AB

排列組合問題:n個數中取m個(Golang實現

(一)組合問題 組合是一個基本的數學問題,本程式的目標是輸出從n個元素中取m個的所有組合。 例如從[1,2,3]中取出2個數,一共有3中組合:[1,2],[1,3],[2,3]。(組合不考慮順序,即[1,2]和[2,1]屬同一個組合) 本程式的思路(來自網

(組合數學3.1.2.1)POJ 2249 Binomial Showdown(排列組合公式的實現)

/* * POJ_2249.cpp * * Created on: 2013年10月8日 * Author: Administrator */ #include <io

排列組合 C語言實現

#include <stdio.h> #include <stdlib.h> int array[] = {1,2,3,4}; #define N 4 #define M