LeetCode 31. 下一个排列

题目链接

31. 下一个排列

题目分析

这个题我好像在算法课上听过,因此5个月前我用算法课上的想法实现了一次,但是时隔5个月,我却忘记了之前的思路,所以专门再写一篇记录文章。
这个题要求我们找比这个数大的最小元素,比如说1 4 2 3 1,那么比这个数更大的最小元素就是1 4 3 1 2
那么其实根据这个思路我们就很好理解了,我们需要从尾巴开始找,找到第一对正序对,因为当a[i] < a[j] (i < j) 的情况下, 我们把a[j] 和a[i]对调,得到的元素肯定比原来的要大。
第二个问题是怎么确保这个元素是比原来的数值大的最小元素呢?
我们可以利用排序的思想,将j + 1到最后一个元素按照升序的思想进行排序,那么这部分的元素绝对是最小的。

代码实现

class Solution {
    public void nextPermutation(int[] nums) {
        int n = nums.length-1;
        for (int i = n-1; i >= 0; i--) {
            for(int j = n;j>i;j--){
                // 找到a[j] > a[i]的情况,调换两者然后对i + 1到 nums.length 进行排序
                if (nums[j]>nums[i]){
                    int temp = nums[i];
                    nums[i] = nums[j];
                    nums[j] = temp;
                    Arrays.sort(nums,i+1,n+1);
                    return;
                }
            }
        }
//当数组本身就是降序的时候,下一个更大的元素就应该将整个数组进行排序
        Arrays.sort(nums);
    }
}
posted @ 2020-09-05 10:34  ZJPang  阅读(77)  评论(0编辑  收藏  举报