[leetcode]数学困惑第七天

      31.下一个排列。题目是给出一组数字的某种排列,要求给出下一个排列,并且还有空间上的要求。

      首先可以知道的是,给定一个n个数字的组合,有n!种排列方式,所以很明显暴力破解不可取。而其实通过例子可以比较明显的看出其中的规律。先从较少的数字开始,比如[1,2,3],下一个排列很明显是[1,3,2],从这可以看出下一个排列中,肯定需要将较小的数字往后挪,或者说与较大的数字进行交换。再比如[1,5,3,8,6,4,2,1],一眼不大能看出结果,可以先分析一下。可以看出,后面5个数字[8,6,4,2,1]是降序排列的,也就是说如果不动前面的话,后面是无法凑出下一个排列的,那就必须移动前面的3,这是第一步,确定移动的数字。接着,移动到哪里去,或者说,用哪个数字和3交换,可以想到,应该用比3大的数字中最小的那个,也就是这里的4,这是第二步。再然后,交换了3和4,剩下的数字排列应该尽可能的小,那就进行升序排列,这就是最后一步。

      具体到算法上,先从后往前遍历,找到不符合降序的数字,再从当前位置往后遍历,找到交换数字的位置,交换后将将后面的数字升序排列,由于原本是降序的,所以可以直接进行翻转。

posted @ 2020-07-21 19:32  小小的豪猪窝  阅读(86)  评论(0编辑  收藏  举报