leetcode #31 下一个排列

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

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

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/next-permutation

思路:
1.找出最右边的第一个升序的元素对, i-1 、 i 。如果找不到则直接将整个数组逆序。
2.若找到了。将 i 以及后面的所有元素排序。
3.排序之后,扫描 i-1 右边所有的元素,找到第一个比 i-1 处大的元素,和i-1处交换。

class Solution {
    public void nextPermutation(int[] nums) {
         int len = nums.length;
         //找到第一个升序
         for(int i = len-1; i>=0; i--){
             if(i == 0){
                  //到头了
                  Arrays.sort(nums);
                  return;
             }else{
                if(nums[i] > nums[i-1]){
                    Arrays.sort(nums, i, len);
                }
                for(int j = i; j < len; j++){
                    if(nums[j] > nums[i-1]){
                        int temp = nums[i-1];
                        nums[i-1] = nums[j];
                        nums[j] = temp;
                        return;
                    }
                }
             }
         }
    }
}
发布了16 篇原创文章 · 获赞 2 · 访问量 445

猜你喜欢

转载自blog.csdn.net/qq_31314141/article/details/104245411