演算法 Next Permutation問題》

2021-08-04 03:36:23 字數 1287 閱讀 8591

此問題描述如下:

給定乙個陣列,首先從後向前找出最長的遞減序列的前乙個元素,比如陣列中,從後向前最長遞減序列是,這個序列的前乙個元素就是4,然後再遞減序列中找到最後乙個比這個數(4)大的數字(就是5),然後將5與4交換,得到新的陣列,然後將交換過後的遞減序列進行翻轉,最後得到的結果就是。如果陣列單調遞減的陣列,比如說是,則直接翻轉就可以得到最終的結果。

注意交換的過程中不能使用額外的空間

如圖表示就是:

**實現:

/**

*@version 2017/7/21.21:33

*/public

class

nextpermutation ;

new nextpermutation().nextpermutation(nums);

for (int num : nums)

}public

void

nextpermutation(int nums)

int decreasingelementindex = getdecreasingelement(nums);

if (decreasingelementindex == -1)

swap(nums, decreasingelementindex, getlastlargeelement(nums, decreasingelementindex));

reverse(nums, decreasingelementindex + 1);

}//獲取比第乙個陣列中從後向前遞減的數大的數

public

intgetlastlargeelement(int nums, int start)

index++;

}return start;

}//從陣列的 某一位置開始反轉陣列

public

void

reverse(int nums, int starindex)

}//從陣列的後向前獲取第乙個遞減的數字的下標,比如,此時要求的 結果就是0

public

intgetdecreasingelement(int nums)

lenght--;

}return -1;

}//交換兩個數

public

void

swap(int nums, int i, int j) }}

全排列生成演算法 next permutation

全排列的生成演算法有很多種,有遞迴遍例,也有迴圈移位法等等。c stl中定義的next permutation和prev permutation函式則是非常靈活且高效的一種方法,它被廣泛的應用於為指定序列生成不同的排列。本文將詳細的介紹prev permutation函式的內部演算法。按照stl文件...

全排列生成演算法 next permutation

歡迎看原部落格!全排列的生成演算法有很多種,有遞迴遍例,也有迴圈移位法等等。c stl中定義的next permutation和prev permutation函式則是非常靈活且高效的一種方法,它被廣泛的應用於為指定序列生成不同的排列。本文將詳細的介紹prev permutation函式的內部演算法...

全排列生成演算法 next permutation

全排列的生成演算法有很多種,有遞迴遍例,也有迴圈移位法等等。c stl中定義的next permutation和prev permutation函式則是非常靈活且高效的一種方法,它被廣泛的應用於為指定序列生成不同的排列。本文將詳細的介紹prev permutation函式的內部演算法。按照stl文件...