用Java实现给a[n]数组进行全排序,找到一个组合的前一个组合,比如a[3]{[2,2,3],[2,3,2],[2,2,3],[2,3,2],[3,2,2], [3,2,2]},给出[2,3,2,],找到他的前序是[2,2,3]
时间: 2023-11-11 08:06:50 浏览: 65
可以使用字典序算法来实现给a[n]数组进行全排序,并找到给定组合的前一个组合。具体实现步骤如下:
1. 从右往左找到第一个非递增的数a[i],记录i的位置。
2. 从右往左找到第一个大于a[i]的数a[j],记录j的位置。
3. 交换a[i]和a[j]。
4. 将i+1后的所有元素按照从小到大的顺序排列,即得到下一个排列。
代码示例:
```java
public void prevPermutation(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, nums.length - 1);
}
private void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
private void reverse(int[] nums, int i, int j) {
while (i < j) {
swap(nums, i++, j--);
}
}
```
使用示例:
```java
int[] nums = {2, 3, 2};
prevPermutation(nums);
System.out.println(Arrays.toString(nums)); // 输出 [2, 2, 3]
```
注意:如果给定的组合已经是最小的排列,则返回最大的排列。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![txt](https://img-home.csdnimg.cn/images/20210720083642.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)