摘要:如果当前数字代表的整数值已经是所有排列组合中的最大值,则返回当前数字组成的最小值。可是这意味着大量无用的数字的生成和比较。一个数字中的各个位上的数如何调整顺序才能获得一个最小的更大值。其次,要保证移动之后,高位以后的值为最小值。
题目要求
Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers. If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order). The replacement must be in-place, do not allocate extra memory. Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column. 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1
翻译过来就是说,输入一个整数数组,该整数数组按照下标顺序代表一个数字,例如[1,2,3]代表整数123,要求改变数组中元素的顺序,找到比当前数字大的生成数中的最小值。如果当前数字代表的整数值已经是所有排列组合中的最大值,则返回当前数字组成的最小值。
思路分析如何才能找到一个值,不是过大也不是过小呢?其实,找到这几个数字所有排列组合的可能性,然后再和当前数字一一进行比较其实也是一个思路。可是这意味着大量无用的数字的生成和比较。想要知道如何生成所有排列组合结果,可以参考我的这篇博客
换句话说,我们要尽量用最少的比较的到最小的结果。一个数字中的各个位上的数如何调整顺序才能获得一个最小的更大值。首先,可以将低位移到高位,只要低位的数字比高位上的数字大。但是,为了确保的到尽可能小的最大值,一定要将移动的位确保越小越好。其次,要保证移动之后,高位以后的值为最小值。
综上所述,思路如下:
由最低位(下表为nums.length-2)开始,由低往高遍历,找到可以进行替换的最小位。
可以替换的条件是,比当前位低的位上存在一个数,该数比当前位上的值大,且不存在另一个比该值小且比当前位上值大的数
替换数值后,该进行替换的位后序的位上的值应当保证为最小值。
例如[1,3,2],将百位上的值和个位上的值替换以后,还要保证百位以后的值为最小值,所以最后的结果为[2,1,3]
实现代码如下
public void nextPermutation(int[] nums) { for(int i = nums.length - 2 ; i>=0 ; i--){ //寻找可以替换的最低位 for(int j = i+1 ; j
想要了解更多开发技术,面试教程以及互联网公司内推,欢迎关注我的微信公众号!将会不定期的发放福利哦~
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/70049.html
摘要:我们所找到的这个元素就是排序需要改变的第一个元素。然后我们选取一个刚好大于此元素的数,与当前元素进行替换。并对后面的所有元素重新按照升序排列就可以得到最终的答案。 题目详情 Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of...
摘要:边界条件,这时候之后只有一个值数组一直递减,这时候变成,没有,只需要从到的所有数。 31. Next Permutation 题目链接:https://leetcode.com/problems... 这道题就是找规律,可以看出来下一个permutation的规律是:从右往左扫,找到第一个满足:nums[i-1] < nums[i]条件的,再找到从右到左第一个比nums[i-1]大的数...
摘要:因为增加高位会带来更大的增益。所以对于一个长为的序列,我们增加第位的前提是,前位已经达到了最大排列方法。因为是找下一个数,所以我们要找一个比小却尽可能大的数,所以找到。把换到的位置后,后三位仍然是个降序的排列。 Next Permutation Implement next permutation, which rearranges numbers into the lexicogr...
摘要:解题思路这道题是要将排列按字典序排列,然后求出下一个排列,一种办法是我们先求出所有的排序情况,但是题目规定不能占有额外空间。每次求出一个数字后,要及时的把它从中删除掉。采用来构造结果序列。 PermutationsGiven a collection of distinct numbers, return all possible permutations. For example, ...
摘要:比如我们很容易知道下一个数字是。从尾到头找,第一段的部分出现。后面的部分就可以有更大的组合。这里是在递减序列中找到下一个比大的数字,作为序列的头。尾部的递减序列变成递增序列。 Implement next permutation, which rearranges numbers into the lexicographically next greater permutation o...
阅读 2991·2021-11-16 11:42
阅读 3621·2021-09-08 09:36
阅读 906·2019-08-30 12:52
阅读 2472·2019-08-29 14:12
阅读 733·2019-08-29 13:53
阅读 3564·2019-08-29 12:16
阅读 630·2019-08-29 12:12
阅读 2455·2019-08-29 11:16