leetcode31. 下一个排列

举报
兔老大 发表于 2021/04/23 00:59:02 2021/04/23
【摘要】 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。 必须原地修改,只允许使用额外常数空间。 以下是一些例子,输入位于左侧列,其相应输出位于右侧列。 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1 思路:贪心的想法,想找到最小的...

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。

如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

必须原地修改,只允许使用额外常数空间。

以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

思路:贪心的想法,想找到最小的,比这个排列大,的排列:

第一,我们希望第一个变大的数字X尽可能地向后,因为X越向后,生成的排列更小。

如何做到这一点?从前往后找到第一个nums[i]<nums[i+1]的数字,如54321就没有这种数字,所以也没有更大的序列,如45321,4就是第一个。

第二:我们希望这个X被替换的尽可能地小,如1254321,我们要替换2,我们应该找3来替换。

第三:我们希望X之后的数字是递增的,这样才能保证是最小排列,如1254321,我们替换为1354221之后,要把54221这部分逆置。


  
  1. public class Solution {
  2. public void nextPermutation(int[] nums) {
  3. int i = nums.length - 2;
  4. while (i >= 0 && nums[i + 1] <= nums[i]) {
  5. i--;
  6. }
  7. if (i >= 0) {
  8. int j = nums.length - 1;
  9. //找到最小的大于nums[i]的值
  10. while (j >= 0 && nums[j] <= nums[i]) {
  11. j--;
  12. }
  13. //交换nums[i]和nums[j]
  14. int temp = nums[i];
  15. nums[i] = nums[j];
  16. nums[j] = temp;
  17. }
  18. //把后面的序列反转成递增的
  19. i++;
  20. int j=nums.length - 1;
  21. while (i < j) {
  22. int temp = nums[i];
  23. nums[i] = nums[j];
  24. nums[j] = temp;
  25. i++;
  26. j--;
  27. }
  28. }
  29. }

 

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/104360900

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。