Leecode31. 下一个排列——Leecode大厂热题100道系列
Posted 来老铁干了这碗代码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leecode31. 下一个排列——Leecode大厂热题100道系列相关的知识,希望对你有一定的参考价值。
我是小张同学,立志用最简洁的代码做最高效的表达
以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言!
传送门——>Leecode大厂热题100道系列题解
问题描述
实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须 原地 修改,只允许使用额外常数空间。
示例 1:
输入:nums = [1,2,3]
输出:[1,3,2]
示例 2:
输入:nums = [3,2,1]
输出:[1,2,3]
示例 3:
输入:nums = [1,1,5]
输出:[1,5,1]
示例 4:
输入:nums = [1]
输出:[1]
提示:
1 <= nums.length <= 100
0 <= nums[i] <= 100
思路
这道题是根据 维基百科 ,下图所示:
翻译过来:
- 先找出最大的索引 k k k满足 n u m s [ k ] < n u m s [ k + 1 ] nums[k] < nums[k+1] nums[k]<nums[k+1],如果不存在,就翻转整个数组;
- 再找出另一个最大索引 l l l满足 n u m s [ l ] > n u m s [ k ] nums[l] > nums[k] nums[l]>nums[k];
- 交换 n u m s [ l ] nums[l] nums[l]和 n u m s [ k ] nums[k] nums[k];
- 最后翻转 n u m s [ k + 1 : ] nums[k+1:] nums[k+1:]。
举个例子:
比如 n u m s = [ 1 , 2 , 7 , 4 , 3 , 1 ] nums = [1,2,7,4,3,1] nums=[1,2,7,4,3,1],下一个排列是什么?
我们找到第一个最大索引是 n u m s [ 1 ] = 2 nums[1] = 2 nums[1]=2
再找到第二个最大索引是 n u m s [ 4 ] = 3 nums[4] = 3 nums[4]=3
交换, n u m s = [ 1 , 3 , 7 , 4 , 2 , 1 ] nums = [1,3,7,4,2,1] nums=[1,3,7,4,2,1];
翻转, n u m s = [ 1 , 3 , 1 , 2 , 4 , 7 ] nums = [1,3,1,2,4,7] nums=[1,3,1,2,4,7]
完毕!
所以,
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)
class Solution {
public:
void nextPermutation(vector<int>& nums) {
bool flag = true;
int len = nums.size();
if(len == 1) return; // 特判
int p = len - 2;
while(p >= 0) {
if(nums[p] < nums[p + 1]) {
flag = false;
for(int i = len-1; i > p; i--) {
if(nums[i] > nums[p]) {
swap(nums[p], nums[i]);
reverse(nums.begin() + p + 1, nums.end());
goto loop;
}
}
}
p--;
}
loop:;
if(flag) reverse(nums.begin(), nums.end());
return;
}
};
以上是关于Leecode31. 下一个排列——Leecode大厂热题100道系列的主要内容,如果未能解决你的问题,请参考以下文章
Leecode240. 搜索二维矩阵 II——Leecode每日一题系列
Leecode06. Z 字形变换——Leecode大厂热题100道系列
Leecode06. Z 字形变换——Leecode大厂热题100道系列