31下一个排列


这个题目如果选择暴力破解的话,循环很多条件很杂

我暂时觉得比较好的方法应该是递归

class Solution {

    // 主方法,处理下一个排列
    public void nextPermutation(int[] nums) {
        int length = nums.length;  // 获取数组的长度
        back(nums, length - 1, length);  // 从数组末尾开始寻找下一个排列
    }

    // 递归方法 back,用于寻找下一个排列
    public void back(int[] nums, int start, int length) {
        // 如果已经遍历到了数组的起始位置,说明没有更大的排列,需将数组重新排序为最小排列
        if (start < 0) {
            Arrays.sort(nums);  // 将数组排序成最小排列(升序)
            return;
        } else {
            // 从数组末尾开始,寻找第一个比 nums[start] 大的元素
            for (int i = length - 1; i >= start; i--) {
                if (nums[start] < nums[i]) {
                    // 交换 nums[start] 和 nums[i]
                    swap(nums, start, i);
                    // 将 start 之后的元素重新排序成最小排列
                    check(nums, start, length);
                    return;  // 退出函数,因为已经找到下一个排列
                }
            }
            // 递归调用 back,从前一个元素继续查找
            back(nums, start - 1, length);
        }
    }

    // 辅助方法 swap,交换数组中的两个元素
    public void swap(int[] nums, int i, int j) {
        int temp = nums[i];  // 临时存储 nums[i] 的值
        nums[i] = nums[j];   // 将 nums[j] 的值赋给 nums[i]
        nums[j] = temp;      // 将临时存储的值赋给 nums[j]
    }

    // 辅助方法 check,用于排序 start 位置后面的元素,确保生成最小的排列
    public void check(int[] nums, int start, int length) {
        // 创建一个新数组 intArray 来存储从 start+1 到数组末尾的所有元素
        int[] intArray = new int[length - start - 1];
        int j = 0;

        // 将 start 之后的元素存入 intArray 中
        for (int i = start + 1; i < length; i++) {
            intArray[j] = nums[i];
            j++;
        }

        // 对 intArray 进行排序,使其成为升序排列(最小排列)
        Arrays.sort(intArray);

        // 将排序后的 intArray 中的元素放回原数组 nums
        j = 0;
        for (int i = start + 1; i < length; i++) {
            nums[i] = intArray[j];
            j++;
        }
    }
}

但是其实过程中调试了很多次,很耗时间,这个方法有点冗杂了
我觉得可能直接转成数字说不定也会很好

然后其实还可以优化的代码在check那,这个地方本质就是一个排序,其实sort已经写好了,不过优化空间不大就是了,就是代码量少很多
然后还有更好的东西的话,我想是在翻转如果start<0
其实可以直接逆序即可,其它代码一致

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xia0Mo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值