Question 3 Iterator for Permutation

规律

example;最小和最大的值, n = 5, k =3

  • combination: min: 123前k位,max345后k位

  • permutation: min: 123前k位,max543后k位的逆序

Method 1: Backtracking Pre-Calculate all permutation

Method 2:1999+ 1= 2000

关键点:

  • 第一个一定是全升序

  • 最后一个一定是全降序

  • bdca后半部分都是递减的人—— 》b是第一个破坏降序(可以增大)的字母—— 〉haunch鞥比他大的最小的——》cabd

观察下

  • 你的下一个一定是比你大的最小的

  • 这就是为什么我写1999 + 1 而不是2999

Detail Logic

Step 1:

  • 找到破坏全降序的第一个字母

  • 如果没有找到这样的字母,说明没有下一个

Step 2:

  • 找到一个字母和这个字母交换,保证得到的是比他大的最小的

  • 保证得到的是比他大的最小的:倒叙遍历看第一个大于当前字母的

Step 3:

  • reverese the whole part except this digit!

  • 那么为什么要reserve呢:swap 能保证后面的部分仍然是降序,所以要reverse成最小的

工具人写法:很多题目需要用到next permutation

=》 step 2: 找到一个字母和这个字母交换,保证得到的是比他大的最小的

  • 保证得到的是比他大的最小的:倒叙遍历来看第一个大雨当前字母的

search range:[i + 1, nums.length - 1]

search for what: first occurrence of element such that array[j] > array[i]

Method 3

Last updated