31. 下一个排列

找到给定数组的下一个更大排列,如果是最大就给递增排列

  1. 一个数字要想变大肯定要把一个大的数字放到放到一个小的位置上
  2. 而且需要是这个的是下一个,所以考虑从后面找
  3. 从后面找到从后往前开走下坡路的数字然后对数字操作
  4. 考虑到最小增量就重新遍历后面的数字,因为这个数字后面的数字是递减的,从后往前看第一个比这个数达的数字就行,两数字互换位子,这个数字后面的数还是递减的,所以还是得交换一下,可以头尾指针交换,可以计算相应下标互换位置,还可以使用rust 的引用切片排序操作
  5. 之前一直只关注最后一位数缺少对其他位置规律的关注
    //数组变逆序
    //len2为找的的位置,需要把len2之后的数字逆序排列,已达到最小排列
    for x in (len2 + 1)..=(len2 + (nums.len() - len2 - 1) / 2) {
     swap(x, nums.len() - 1 - (x - len2 - 1), nums);
    }