leetcode 31 下一个排列

package com.feng.testproject.algorithm;

import java.util.Arrays;

public class L31 {
    public static void main(String[] args) {
        int[] nums = {2,3,1,3,3};
        nextPermutation(nums);
    }

    /**
     * 如果全是升序在调换最后两位的位置
     * 如果全是降序则升序排列
     * 以下为有拐点的情形
     *      先升后降 132,231  将第一位以及之后所有的数字排序并将首位放大一位的数字
     *      先降后升312 调换最后两位的位置
     * @param nums
     */
    public static void nextPermutation(int[] nums) {
        if (nums.length < 2) {
            return;
        }
        if (nums.length == 2) {
            int temp = nums[0];
            nums[0] = nums[1];
            nums[1] = temp;
            return;
        }
        int left = nums[nums.length - 1];
        int right = nums[nums.length - 1];
        // flag表示true升序  false降序
        boolean flag = true;
        int equals = -1;
        for (int i = nums.length - 2; i > 0; i--) {
            int curr = nums[i];
            left = nums[i - 1];
            right = nums[i + 1];

            if (left == curr && curr != right) {
                equals = i + 1;
            }
            if (curr == right && equals != -1) {
                right = nums[equals];
            }

            if (curr <= right && left <= curr) {
                flag = true;
            } else if (curr >= right && left >= curr) {
                flag = false;
            } else {
                if (curr <= right && left > curr) {  // 先降后升
                    for (int j = nums.length-1; j > 0 ; j--) {
                        if (nums[j-1] != nums[j]) {
                            int temp = nums[j-1];
                            nums[j-1] = nums[j];
                            nums[j] = temp;
                            return;
                        }
                    }
                } else if (curr >= right && left < curr) {  // 先升后降
                    Arrays.sort(nums, i-1, nums.length);
                    int index = 0;
                    for (int j = nums.length-1; j > i-1; j--) {
                        if (left < nums[j]) {
                            index = j;
                        }else {
                            break;
                        }
                    }
                    int temp = nums[index];
                    for (int j = index; j > i-1; j--) {
                        nums[j] = nums[j-1];
                    }
                    nums[i-1] = temp;
                    return;
                }
            }
        }
        if (flag) {  //升序
            int temp = nums[nums.length - 2];
            nums[nums.length - 2] = nums[nums.length - 1];
            nums[nums.length -1] = temp;
        } else {  //降序
            Arrays.sort(nums);
        }
    }
}

总结

题目给的样例主要是三个数字,刚开始考虑以三个数字为基础的规律浪费了很长时间
不知道有更多的样例是否能总结出 从后往前找第一个降序排序的排列就是要找的答案

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值