31. 下一个排列-LeetCode

博客分享求下一个排列数的心得,分三步:先找到被替换数,从后往前找第一个后面比前面大的数;再找到替换数并交换;最后把被替换数后面的数字逆序。还给出代码转载来源。

 

心得:求下一个排列数,分三步:

        1.找到被替换数

         2.找到替换数,交换

         3,把被替换数后面的数字逆序。

       被替换数是从后往前找,找到第一个后面比前面大的数(!!这说明找过的数都是前面比后面大)把前面的数作为被替代数,替代数之后都是递减的,然后最后再来一次,找到第一个大于被替代数的(这个数肯定存在,因为被替代数后面相邻的肯定大于他),然后交换,交换之后原来被替代数后面的数组还是递减的,因为他小于前面的,并且大于后面的,所以可以通过首尾交换逆序。

代码:

 1 class Solution {
 2     public void nextPermutation(int[] nums) {
 3           int num1=0;
 4           if(nums==null||nums.length==1)
 5               return;
 6             for(int i=nums.length-1;i>0;i--)
 7             {
 8                 if(nums[i-1]<nums[i])
 9                 {
10                      num1=nums[i-1];
11                      for(int j=nums.length-1;j>i-1;j--)
12                      {
13                          if(nums[j]>nums[i-1])
14                          {
15                              int tmp=nums[j];
16                              nums[j]=nums[i-1];
17                              nums[i-1]=tmp;
18                              for(int m=i,n=nums.length-1;m<=n;m++,n--)
19                              {
20                                  int tmp2=nums[m];
21                                  nums[m]=nums[n];
22                                  nums[n]=tmp2;
23                              }
24                              return;
25                          }
26                      }
27                 }
28                 
29                 
30             }
31          Arrays.sort(nums);
32         }
33 }

 

转载于:https://www.cnblogs.com/pc-m/p/10902246.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值