博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LC31 Next Permutation
阅读量:6940 次
发布时间:2019-06-27

本文共 1675 字,大约阅读时间需要 5 分钟。

有关排列的题目,如果用DFS去做,就十分低效。这里介绍一种做法:求下一个序列,先从尾部开始找最长的递增数组,如果从尾到头都是递增,则这已经是最大序列,下一个序列就是将最大序列翻转一下。如果不存在递增数组,则将最后两位数交换一下。其他情况,则记录下递增数组的前一位数,并找出递增数组中比这个数大的最小的那个数,交换两个数位置,然后将这个递增数组翻转一下,结果就是下一个序列。网上可以找到相关证明。

1 class Solution { 2 public: 3     void nextPermutation(vector
& nums) { 4 if(nums.size()<=1) 5 return; 6 int i=nums.size()-1; 7 while(i>=1&&nums[i-1]>=nums[i]) 8 { 9 i--;10 }11 if(i==0)12 {13 reverse(nums.begin(),nums.end());14 }15 else if(i==nums.size()-1)16 {17 swap(nums[i],nums[i-1]);18 }19 else20 {21 i--;22 int j;23 for(j=nums.size()-1;j>=i;j--)24 {25 if(nums[j]>nums[i])26 break;27 }28 swap(nums[i],nums[j]);29 reverse(nums.begin()+i+1,nums.end());30 }31 }32 };
View Code

如果要求上一个序列,则是找最长的递减数组。其他分析都差不多。

1 class Solution { 2 public: 3     void prevPermutation(vector
& nums) { 4 if(nums.size()<=1) 5 return; 6 int i=nums.size()-1; 7 while(i>=1&&nums[i-1]<=nums[i]) 8 { 9 i--;10 }11 if(i==0)12 {13 reverse(nums.begin(),nums.end());14 }15 else if(i==nums.size()-1)16 {17 swap(nums[i],nums[i-1]);18 }19 else20 {21 i--;22 int j;23 for(j=nums.size()-1;j>=i;j--)24 {25 if(nums[j]
View Code

 

转载于:https://www.cnblogs.com/vaecn/p/5348045.html

你可能感兴趣的文章
更改DEB包内容
查看>>
我的友情链接
查看>>
ibatis动态语句中的prepend
查看>>
keepalived实现LVS的高可用以及实现web服务的高可用(主从模型、双主模型)
查看>>
linux apache
查看>>
Mysql DBA 高级运维学习之路-删除表中数据
查看>>
4.26日第14次作业,23章项目整体绩效评估,24-32章信息安全相关知识
查看>>
新一代java模板引擎典范 Beetl
查看>>
centos6.8+nginx搭建简单的https服务器
查看>>
cut,sort,wc,uniq,tee,tr,split,并且,和,或者
查看>>
LVS负载均衡之三:LVS-DR搭建web群集、LVS结合Keepalived搭建高可用web群集
查看>>
JavaScript 堆内存分析新工具 OneHeap
查看>>
浅谈java异常机制
查看>>
Docker 监控之 SaaS 解决方案
查看>>
用struts2实现简单的登录操作
查看>>
openstack-理解cinder服务
查看>>
基于Karma 和 Jasmine 的Angular 测试(持续更新中)
查看>>
Maven入门指南(一)
查看>>
Silverlight自定义数据绑定控件应该如何处理IEditableObject和IEditableCollectionView对象...
查看>>
在CMD命令行下关闭进程的命令
查看>>