31-下一个排列

31-下一个排列

力扣31

https://leetcode-cn.com/problems/next-permutation/

也就是比当前排列大的最小排列,这题说实话有点考思维,有点像智力题

我直接给出结果再分析

从后往前找第一个nums[i] < nums[i + 1],交换,将[i+1 : n]排序

分析

其实我说完结论你细想确实是这么回事

一般来说我们几个数字做排列的时候,

  • 想排出最大的数字,肯定是大数放前面。换句话说,只要不是满足nums[i] > nums[i + 1],就一定不是最大的排列
  • 想排出最小的数字,肯定是小数放前面。

那么如果我们想找到比某个排列大的排列,我们也应该遵从这个思路

  1. 先从后往前找nums[i] < nums[i + 1],交换那么nums[i] > nums[i + 1],那么这个数一定比当前的大
  2. 将剩下的[i+1 : n]升序排序

两步可互换

举个例子:

如果要找比[1, 5, 6, 4]大的排列,先找到5 < 6,交换,[1,6,5,4],这个排列一定比原来的大,将[5,4]升序排序,[1,6,4,5],就找到了比这个排列大的最小排列

思路清晰,这题写起来并不难

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void nextPermutation(int[] nums) {
for (int i = nums.length - 2; i >= 0; i--) {
if (nums[i] < nums[i + 1]){
Arrays.sort(nums, i + 1, nums.length);
for (int j = i + 1; j < nums.length; j++) {
if (nums[j] > nums[i]){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
return ;
}
}
}
}
Arrays.sort(nums); //题目要求已经是最大排列的话,变回最小
}

其他题目点击这里

#
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×