31. 下一个排列

image.png

1,6,9,8,7
第一步 查找从末尾开始需要保持升序,开始查找截断升序数字的索引 987 从末尾看一直是升序的 ,6是就截断
第二步 截断升序的索引和末尾开始升序数组中第一个比自己大数字交互位置 这个数组就是7 交换6和7的位置
第三步 对末尾开始升序数组进行重新排列,成一个整体数组的升序 现在17986 当时不是最合适的 需要转成17689

  1. package main
  2. import (
  3. "fmt"
  4. "sort"
  5. )
  6. func nextPermutation(nums []int){
  7. // 倒序查找第一个 默认是升序 查找截断升序的索引位置
  8. index :=-1
  9. for i:=len(nums)-1;i>0;i--{
  10. if nums[i-1]<nums[i] {
  11. index = i-1
  12. break
  13. }
  14. }
  15. // 从末尾一直是升序
  16. if index==-1 {
  17. sort.Ints(nums)
  18. return
  19. }
  20. for i:=len(nums)-1;i>index;i--{
  21. if nums[i]>nums[index] {
  22. nums[i],nums[index]=nums[index],nums[i]
  23. break
  24. }
  25. }
  26. sort.Ints(nums[index+1:])
  27. fmt.Println(nums)
  28. }
  29. func main() {
  30. nextPermutation([]int{1,2,3})//1 3 2
  31. nextPermutation([]int{3,2,1})// 1 2 3
  32. nextPermutation([]int{1,5,1})// 5 1 1
  33. nextPermutation([]int{1,1,5})// 1 5 1
  34. nextPermutation([]int{1,6,9,8,7})// 1 7 6 8 9
  35. }

image.png