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