题意:

image.png

解题思路:

  1. 思路:
  2. 1,2,3 1,3,2
  3. 3,2,1 1,2,3
  4. 1,1,5 1,5,1
  5. index:1
  6. 1 2 7 4 3 1 //右到左第一个逆序的数字 是 2
  7. 1 2 7 4 3 1 //右到左第一个比逆序的数字大的数字 是 3
  8. 1 3 7 4 2 1 // 2 和 3 交换
  9. 1 3 7 4 2 1 //index之后的数字翻转
  10. index
  11. 1 3 1 2 4 7

PHP代码实现:

  1. class Solution {
  2. function nextPermutation(&$nums) {
  3. $n = count($nums);
  4. for ($i = $n - 1; $i >= 0; $i--) {
  5. if ($nums[$i + 1] > $nums[$i]) {
  6. for ($j = $n - 1; $j >= 0; $j--) {
  7. if ($nums[$j] > $nums[$i]) {
  8. break;
  9. }
  10. }
  11. $temp = $nums[$i];
  12. $nums[$i] = $nums[$j];
  13. $nums[$j] = $temp;
  14. $left = $i + 1;
  15. $right = $n - 1;
  16. return $this->reverse($nums, $left, $right);
  17. }
  18. }
  19. return $this->reverse($nums, 0, $n - 1);
  20. }
  21. function reverse(&$nums, $left, $right) {
  22. while ($left < $right) {
  23. $temp = $nums[$left];
  24. $nums[$left] = $nums[$right];
  25. $nums[$right] = $temp;
  26. $left ++;
  27. $right --;
  28. }
  29. }
  30. function swap(&$nums, $i, $j) {
  31. $tmp = $nums[$i];
  32. $nums[$i] = $nums[$j];
  33. $nums[$j] = $tmp;
  34. }
  35. function nextPermutation1(&$nums) {
  36. if ($nums == null || count($nums) < 2) return;
  37. $n = count($nums);
  38. $p = $n - 2;
  39. while ($p >= 0 && $nums[$p] >= $nums[$p+1]) --$p;
  40. if ($p >= 0) {
  41. $i = $n - 1;
  42. while ($i > $p && $nums[$i] <= $nums[$p]) --$i;
  43. $this->swap($nums, $i, $p);
  44. }
  45. for ($i = $p+1, $j = $n-1; $i < $j; ++$i,--$j)
  46. $this->swap($nums, $i, $j);
  47. }
  48. }

GO代码实现:

  1. func nextPermutation(nums []int) {
  2. n := len(nums)
  3. i, j := n-2, n-1
  4. // 从右往左找到第一个非递增的数
  5. for ; i >= 0; i-- {
  6. if nums[i+1] > nums[i] {
  7. break
  8. }
  9. }
  10. if i < 0 {
  11. reverse(nums)
  12. return
  13. }
  14. // 从右往走找到第一个比nums[i]大的数
  15. for ; j >= 0; j-- {
  16. if nums[j] > nums[i] {
  17. break
  18. }
  19. }
  20. nums[j], nums[i] = nums[i], nums[j]
  21. // 将非递增位置之后的反转成为从右往走递减序列
  22. reverse(nums[i+1:n])
  23. }
  24. func reverse(nums []int) {
  25. l, r := 0, len(nums)-1
  26. for l <= r {
  27. nums[l], nums[r] = nums[r], nums[l]
  28. l, r = l+1, r-1
  29. }
  30. }