47.順列II
中
重複を含む可能性のある数字の集合を考えると、すべての可能なユニークな順列を返します。
例:
入力:[1,1,2] 出力 : [ [1,1,2]、 [1,2,1]、 [2,1,1] ]
容認されました
257204
提出
622317
C ++方法:
これが最後の46にあまりにも似ているので、これだけのベクター内の重複を削除するには、「設定」しましょう
私たちは、この方法を使用します
これはパフォーマンスの低下であるpass.Butことができ、元のコードを変更するには、このメソッドを使用します
#include < セット > の#include <ベクトル> の#include <iostreamの> 使用して 名前空間STDを、 INT メイン() { ベクトル < INT > VEC。 VEC = { 1、2、3、4、8、9、3、2、1、0、4、8 }。
//ループのためだけに、再びベクトルに設定し評価し、VECセットを与える最後に始めましょう 設定 < int型> ST(vec.begin()、vec.end())。 vec.assign(st.begin()、st.end())。 ベクトル < 整数 > ::イテレータit。 以下のために(;それ= vec.end();!それは)(vec.beginを=それ++ )
//&アドレスを意味し、*手段は、値の取得 はcout << *それ<< てendlを。 リターン 0 ; }
する#include <stdio.hに> する#include <iostreamの> する#include < ストリング > の#include <ベクトル> の#include < 設定 > 使用して 名前空間STD。 クラス解決{ パブリック: ベクトル <ベクトル< INT >>並び替える(ベクトル< INT >&NUMS){ セット <ベクトル< INT >> RES。 ベクトル <ベクトル< int型 >> RES1。 ベクトル < 整数 > うち、0 )。 DFS(うち、NUMS、解像度、訪問、0 ); res1.assign(res.begin()、res.end())。 リターンRES1。 } ボイド DFS(ベクトル< INT >&アウト、ベクトル< INT >&NUMS、設定 <ベクトル< INT >>&RES、ベクトル< INT >&訪問し、int型のラベル) { 場合(ラベル== nums.size()) {res.insert(アウト)。返す;} ため(int型 I = 0 ; iが(nums.sizeを<); iが++ ) { 場合(訪問[I] == 1)続けます。 アウト.push_back(NUMS [I])。 訪問[I] = 1 。 DFS(うち、NUMS、解像度は、ラベル+、訪問した1 )。 アウト.pop_back(); [i]が訪れた = 0 ; } を返します。 } }。 INT メイン() { 溶液S。 ベクトル < int型 > V。 ベクトル <ベクトル< int型 >> RES。 v.push_back( 1 )。 v.push_back(1 )。 v.push_back(2 )。 // v.push_back(1)。 // v.push_back(4)。 RES = s.permute(V)。 以下のための(ベクトル<ベクトル< int型 >> ::)それは(res.beginを=イテレータ、それ= res.end();!++ それ){ のために(int型私は= 0 ;私は<(*それ).size( ); ++ I) はcout <<(*それ)[I] << " " ; coutの << てendl; } // COUT << RES << ENDL。 リターン 0 ; }