求某一排列在n!个全排列中 是第几个、 Pre_permutation原理

本文探讨了Pre_permutation的本质,详细讲解如何寻找一个特定排列在所有n!个全排列中的位置,阐述了这一数学问题的关键思路和解决方法。
摘要由CSDN通过智能技术生成

Pre_permutation本质

https://leetcode-cn.com/problems/minimum-number-of-operations-to-make-string-sorted/

给定你一个字符串['a'- 'z']
定义一次操作为(一次操作 = 4个步骤):
  1,找“最后一个”满足: S[i] < S[i - 1] (即i要尽可能的大)
  2,从i往后找 第一个j,满足: S[i, i+1, ..., j] < S[i - 1]
  3swap(S[i - 1], S[j])
  4reverse(S[i], S + n);
问: 你需要操作几次,这个字符串可以变成sorted(当sorted后,你的1 自然是找不到的)

' 一次操作(即4步),非常非常复杂...  '
  注意,1这一步: 我们只关注S[i-1] 和 S[i]!!! 前面的元素不用管!!
  比如:  1 2 3 4 5 1 6 1 7 1    ' 我们需要找到{7, 1}这一对!! 因为他是最后出现的!'
  
  xxxxx   5    1  2 3 4  4  5 5 6 7
  		 i-1   i         j
  ' i后面的,一定是递增的!!!  因为此时第1步已经确定了 '
  ' S[i, i+1, .., j] < S[i - 1] '
  执行3后, xxx   4   1 2 3 4   5   5 5 6 7
   我们发现,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值