设为首页 收藏本站
查看: 463|回复: 0

[经验分享] Leetcode31--->Next Permutation(数字的下一个排列)

[复制链接]

尚未签到

发表于 2017-7-4 21:45:22 | 显示全部楼层 |阅读模式
  题目: 给定一个整数,存放在数组中,求出该整数的下一个排列(字典顺序);要求原地置换,且不能分配额外的内存
  举例:
  1,2,3 → 1,3,2;  
3,2,1 → 1,2,3;  
1,1,5 → 1,5,1;  
  解题思路:
  1. 由于要找出整数的下一个排列,且按照字典顺序,因此要找出当前排列中需要交换的的那个位,即找到从右到左第一个不满足升序的元素的前一个元素nums[index1], 以及从右到左第一个大于nums[index1]的元素nums[index2];
  2. 交换两个元素;因为是按字典顺序排列的,而nums[index2]是第一个大于nums[index1]的元素,此时[index1 + 1, index2]之间的元素都是大于nums[index2]以及nums[index1]的,而nums[index2]是从右往左第一个大于nums[index1]的元素,因此[index2 + 1, len]的元素都是小于nums[index1],因此当nums[index1]与nums[index2]交换后,[index1 + 1, len]之间的元素就是一个降序
  3. 但是由于在交换了nums[index1]和nums[index2]元素后,nums[index2]元素后面本应该是按字典顺序最小的数字组合,而[index1 + 1,结尾]之间的元素是降序的,是字典顺序的最大组合排列,因此需要将[index1 + 1, 结尾]之间的数据全部逆转,才能得到字典的下一个排列组合;
  代码如下:



1 public class Solution {
2     public void nextPermutation(int[] nums) {
3         if(nums == null || nums.length < 1)
4             return;
5         int len = nums.length - 1;
6         int data = nums[len];
7         int index1 = -1;
8         int index2 = 0;
9         for(int i = len - 1; i >= 0; i--) // 找到从右往左第一个不满足升序的元素的前一个元素
10         {
11             if(data <= nums)
12                 data = nums;
13             else
14             {
15                 index1 = i;
16                 break;
17             }
18         }
19         if(index1 != -1) // 表示可以找到这样的数,即给定的数字不是降序
20         {
21             for(int i = len; i >=0; i--)  // 找到从右往左第一个大于第一次找到的那个元素的元素
22             {
23                 if(nums > nums[index1])
24                 {
25                     index2 = i;
26                     break;
27                 }
28             }
29             exchange(nums, index1, index2);  //此时[index1 + 1, index2]之间的元素都是大于nums[index2]以及nums[index1]的,而nums[index2]是从右往左第一个大于nums[index1]的元素,因此[index2 + 1, len]的元素都是小于nums[index1],
         因此当nums[index1]与nums[index2]交换后,[index1 + 1, len]之间的元素就是一个降序

30         
31         }
32         index1 = index1 + 1;
33         while(index1 < len)  // 将index1位置之后的元素全部逆转【index + 1, len】之间的元素是降序排列,而我们需要的是nums[index1]元素之后的最小排列组合
34         {
35             exchange(nums, index1, len);
36             index1 ++;
37             len --;
38         }
39     }
40     public void exchange(int[] nums, int index1, int index2)
41     {
42         int data = nums[index1];
43         nums[index1] = nums[index2];
44         nums[index2] = data;
45     }
46 }

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-390790-1-1.html 上篇帖子: 计算hashCode的常见方法 下篇帖子: CF Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表