全排列問題

2021-10-04 13:25:44 字數 1903 閱讀 4482

給定乙個乙個序列,輸出他的全排列

比如.全排列就是:

1,2,3

1,3,2

2,1,3

2,3,1

3,1,2

3,2,1

可以先看乙個例子。

給定乙個序列輸出下乙個比它大的序列

例如:arr

比它大的下乙個排列就是

具體怎麼做的?

1.從arr.len-1位置到0開始找arr[i]>arr[i-1].找到之後,將i-1位置的數記住ind1;沒找到則說明這個序列沒有下乙個比它大的序列。

2.從arr.len-1位置到i-1位置開始找arr[i]>ind1的數。講這個數記做ind2。

3.將ind1和ind2交換。

4.將i位置和arr.len-1位置的元素排序或者逆序。

例子演示:

1.先找到ind1就是3,它的下標是2,i下標就是3.

2.在找到ind2就是4。

3.將ind1和ind2交換。

4.將3位置和arr.len-1位置的元素排序或者逆序。

比它大的下乙個排列就是。

bool

nextpermutation

(vector<

int>

& nums)

swap

(nums[i-1]

,nums[j]);

sort

((nums.

begin()

+i),nums.

end())

;return

true;}

}if(i==0)

return

false

;}

其實c++的標頭檔案中有乙個方法就是我們上面實現的這個,叫做next_permutation(begin(),end()),它的返回值為bool型別,true表示找到,false表示找不到!

接下來再看全排列問題就容易多了,其實就是將序列sort為最小,然後求出它的所有下乙個更大的排列。

庫函式實現全排列:

#include

#include

#include

using

namespace std;

intmain()

;sort

(v.begin()

,v.end()

);dowhile

(next_permutation

(v.begin()

, v.

end())

);return0;

}

應用咱們自己寫的方法實現全排列:

class

solution

swap

(nums[i-1]

,nums[j]);

sort

((nums.

begin()

+i),nums.

end())

;return

true;}

}return

false;}

public

: vector

int>>

permuteunique

(vector<

int>

& nums)

while

(nextpermutation

(nums));

return ret;}}

;

結果:

ps:這個方法同樣適用於求含有重複數的全排列哦!

2.全排列

3.全排列ii

參考部落格:

全排列問題

一 全排列問題演算法描述如下 舉例 345的全排列分別為 345 354 435 453 534 543,可見將整組數中的所有的數分別與第乙個數交換,這樣就總是在處理後n 1個數的全排列。又舉例 45的全排列有 45 54 可見將第乙個數分別與後面的數交換後輸出即為45的全排列。所以,對於乙個很長一...

全排列問題

題目描述814 全排列問題 鍵盤輸入n 1 n 10 個字元,輸出輸出其全排序。第一行為字元個數k,第二行為k個字元,不用空格隔開。輸出其每種排列佔一行,各字元間用一空格隔開。樣例輸入 3abc 樣例輸出 a b c a c b b a c b c a c b a c a b includeint ...

全排列問題

全排列就是從第乙個數字起 每個數分別與它後面的數字交換 用c 寫乙個函式,如 foo const char str 列印出 str 的全排列,如 abc 的全排列 abc,acb,bca,dac,cab,cba。第一種方法 用遞迴 不包含有重複數字或字元出現的情況 void swap char a,...