1. <?php
    2. class Solution {
    3. /**
    4. * 1,2,7,4,3,1 // 从右到左第一个逆序数是2
    5. * 1,2,7,4,3,1 // 从右到左第一个比逆序数大的数是3
    6. * 1,3,7,4,2,1 // 交换2和3
    7. * 1,3,1,2,4,7 // 原2位置后面的数字翻转
    8. *
    9. * @param $nums
    10. */
    11. public function nextPremutation(&$nums) {
    12. $n = count($nums);
    13. for ($i = $n - 2; $i >= 0; $i--) {
    14. if ($nums[$i + 1] < $nums[$i]) continue;
    15. if ($i < 0) break;
    16. for ($j = $n - 1; $j >= 0; $j--) {
    17. if ($nums[$j] > $nums[$i]) {
    18. break;
    19. }
    20. }
    21. $tmp = $nums[$i];
    22. $nums[$i] = $nums[$j];
    23. $nums[$j] = $tmp;
    24. $left = $i + 1;
    25. $right = $n - 1;
    26. $this->reverse($nums, $left, $right);
    27. return;
    28. }
    29. $this->reverse($nums, 0, $n - 1);
    30. return;
    31. }
    32. private function reverse(&$nums, $left, $right) {
    33. while($left < $right) {
    34. $tmp = $nums[$left];
    35. $nums[$left] = $nums[$right];
    36. $nums[$right] = $tmp;
    37. $left++;
    38. $right--;
    39. }
    40. }
    41. }
    42. $s = [1,2,7,4,3,1];
    43. $cls = new Solution();
    44. $cls->nextPremutation($s);
    45. echo implode(',', $s);