此問題描述如下:
給定乙個陣列,首先從後向前找出最長的遞減序列的前乙個元素,比如陣列中,從後向前最長遞減序列是,這個序列的前乙個元素就是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文件...