Leetcode 31. Next Permutation --数组的下一个(字典顺序更大的)排列

本文介绍了LeetCode第31题的解决方案,探讨如何找到一个整数数组的下一个字典序排列。通过对数组的排序规则和字典序的理解,实现原地修改数组,找到其下一个排列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

permutation of an array of integers is an arrangement of its members into a sequence or linear order.

  • For example, for arr = [1,2,3], the following are considered permutations of arr[1,2,3][1,3,2][3,1,2][2,3,1].

The next permutation of an array of integers is the next lexicographically greater permutation of its integer. More formally, if all the permutations of the array are sorted in one container according to their lexicographical order, then the next permutation of that array is the permutation that follows it in the sorted container. If such arrangement is

### Java 实现 LeetCode一个排列 (Next Permutation) 对于给定的一组数字,重新安排成字典顺序中的下一个更大排列。如果这样的排列不存在,则需重置为最小的排列(即按升序排序)。必须原地修改而不分配额外的空间。 #### 解决方案描述 算法的核心在于找到从右向左遍历时的第一个非递增元素的位置 `pos` 。一旦找到了这个位置,继续寻找位于该位置右侧且刚好大于此位置数值的那个数,并交换两者。最后一步是对 `pos` 右侧所有的数进行反转操作来获得最终的结果[^4]。 ```java public class Solution { public void nextPermutation(int[] nums) { int i = nums.length - 2; while(i >= 0 && nums[i] >= nums[i + 1]) { --i; } if (i >= 0) { int j = nums.length - 1; while(j >= 0 && nums[j] <= nums[i]) { --j; } swap(nums, i, j); } reverse(nums, i + 1); } private void swap(int[] array, int a, int b){ int temp = array[a]; array[a] = array[b]; array[b] = temp; } private void reverse(int[] array, int start){ int end = array.length - 1; while(start < end){ swap(array, start++, end--); } } } ``` 上述代码实现了以下逻辑: - 首先尝试定位到第一个违反降序规则的地方; - 如果存在这样一个地方 (`pos`) ,则在此之后的部分中找出恰好较大的那个值并与其互换; - 对于已经处理过的部分执行逆序转换以确保得到的是最接近当前状态的新组合形式; - 特殊情况下当输入已经是最大可能的情况时,直接返回其相反情况作为答案,也就是全局倒叙一次即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

二十六画生的博客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值