LeetCode 31. 下一个排列
思路
- 因为找的是字典序升序的下一个排列,因此要尽量保证前面不动,我们从后往前考虑
- 从后往前找到第一个非降序的位置,然后把这个位置的数字和最小的比它大的数字交换,最后从该位置后整理为升序
- 这样保证了值变大,且增大的最少
- 从数组末尾往前找,找到
第一个
位置j
,使得nums[j] < nums[j + 1]
。 - 如果不存在这样的
j
,则说明数组是不递增的,直接将数组逆转即可。 - 如果存在这样的
j
,则从末尾找到第一个位置i > j
,使得nums[i] > nums[j]
。 - 交换
nums[i]
与nums[j]
,然后将数组从j + 1
到末尾部分逆转。
时间复杂度分析
- 线性遍历数组常数次,因此O(n)
实现代码
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int n=nums.size()-1;
while(n&&nums[n]<=nums[n-1]) n--;
if(n<=0) reverse(nums.begin(),nums.end());//整体降序
else
{
//此时nums[n]>nums[n-1]
int t=n;
while(t<nums.size()&&nums[t]>nums[n-1])//寻找最小的且>nums[n-1]的数
t++;
swap(nums[t-1],nums[n-1]);
reverse(nums.begin()+n,nums.end());//将k后面的数改成升序
}
return;
}
};
有帮助的话可以点个赞,我会很开心的~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具