示例:73642 的下一个排列是74236
- 从右往左遍历,比较相邻两个数据 右侧数据是否比左侧大,找到:"36": 6比3大
- 继续从该节点“3”的右侧数据中 找出比3大 最小的那个数据,找到4
- 3和4交换位置;74632
- 对交换后4右侧的数据进行排序:74236
class Solution {
/**
* @param Integer[] $nums
* @return NULL
*/
function nextPermutation (&$nums)
{
if (sizeof($nums) < 2) {
return $nums;
}
$i = sizeof($nums) - 1;
while ($i > 0) {
// 从右到左 如果相邻数据 右边的值比左边的大
if ($nums[$i] > $nums[$i - 1]) {
$j = sizeof($nums) - 1;
// 遍历该节点右侧的数据
while ($j > $i - 1) {
// 找到这其中比该节点大的数据 进行交换
if ($nums[$j] > $nums[$i - 1]) {
$p = $nums[$j];
$nums[$j] = $nums[$i - 1];
$nums[$i - 1] = $p;
// 然后对该节点右侧的数据从小到大排序
for ($m = $i; $m <= sizeof($nums) - 1; $m++) {
for ($n = $m + 1; $n <= sizeof($nums) - 1; $n++) {
if ($nums[$n] < $nums[$m]) {
$q = $nums[$m];
$nums[$m] = $nums[$n];
$nums[$n] = $q;
}
}
}
return $nums;
}
$j--;
}
}
$i--;
}
// 如果数据是倒序数组,则直接反转
for ($k = 0; $k < (sizeof($nums) - 1) / 2; $k++) {
$l = $nums[$k];
$nums[$k] = $nums[sizeof($nums) - 1 - $k];
$nums[sizeof($nums) - 1 - $k] = $l;
}
return $nums;
}
}