31. 下一个排列 - LeetCode

31. 下一个排列

题目链接

找规律

  • 从后往前找,找到在数组末位的最长的逆序子数据,子数组的前一位就是要变的位置
  • 要将前一位替换成逆序子数组中最小的比它大的数,然后将逆序子数组排序即可
  • 特殊情况:全部逆序,包括数组长度为1,都直接返回有序数组即可
class Solution {
    public void nextPermutation(int[] nums) {
        int len = nums.length;
        if(len == 1) return;
        int i;
        for(i = len - 1; i > 0 && nums[i] <= nums[i-1]; i--);
        if(i == 0){
            Arrays.sort(nums);
            return;
        }
        i--;
        int j;
        for(j = len - 1; j >= i && nums[j] <= nums[i]; j--);
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
        Arrays.sort(nums, i+1, len);
    }
}

31. 下一个排列

题目链接

找规律

  • 从后往前找,找到在数组末位的最长的逆序子数据,子数组的前一位就是要变的位置
  • 要将前一位替换成逆序子数组中最小的比它大的数,然后将逆序子数组排序即可
  • 特殊情况:全部逆序,包括数组长度为1,都直接返回有序数组即可
class Solution {
    public void nextPermutation(int[] nums) {
        int len = nums.length;
        if(len == 1) return;
        int i;
        for(i = len - 1; i > 0 && nums[i] <= nums[i-1]; i--);
        if(i == 0){
            Arrays.sort(nums);
            return;
        }
        i--;
        int j;
        for(j = len - 1; j >= i && nums[j] <= nums[i]; j--);
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
        Arrays.sort(nums, i+1, len);
    }
}
posted @ 2021-02-14 15:48  一天到晚睡觉的鱼  阅读(26)  评论(0)    收藏  举报