力扣第31题 中等难度 下一个排列

先看一眼题
在这里插入图片描述

没看懂题,直接看了评论,意思是比如现在[1,2,3]
那么其按字典组合有6种情况:
123、132、213、231、312、321
然后选择刚好比123大的数,也就是132

没做出来,直接看了答案思路:
1.我们需要将一个左边的「较小数」与一个右边的「较大数」交换,以能够让当前排列变大,从而得到下一个排列。
2.同时我们要让这个「较小数」尽量靠右,而「较大数」尽可能小。当交换完成后,「较大数」右边的数需要按照升序重新排列。这样可以在保证新排列大于原来排列的情况下,使变大的幅度尽可能小。
·我只想到了第一点和第二点的较小数尽量靠右,没有想到较小数要尽可能小

代码:

public class Solution31 {
    public void nextPermutation(int[] nums) {
        int i;
        //寻找较小数
        for(i = nums.length-1;i>0;i--){
            if(nums[i]>nums[i-1]){
                break;
            }
        }
        if(i==0) {
            Arrays.sort(nums);
            return;
        }
        //得到较小数位置
        i--;
        //寻找较大数
        int j;
        for(j=nums.length-1;j>i;j--){
            if(nums[j]>nums[i])
                break;
        }
        //交换位置
        int temp = nums[j];
        nums[j]=nums[i];
        nums[i]=temp;
        //i现在是较大数的位置,将其后面的数进行排序(此时i后面必然是降序数组,所以直接对其进行翻转,而不是排序)
        for(i++,j=nums.length-1;i<j;i++,j--){
            temp = nums[j];
            nums[j]=nums[i];
            nums[i]=temp;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值