题目链接

31. Next Permutation

题意

给定一段排列,输出其升序相邻的下一段排列。比如[1,3,2]的下一段排列为[2,1,3]。

注意排列呈环形,即[3,2,1]的下一段排列为[1,2,3]

思路

这个题蛮巧妙的,关键在于发现规律。假如给定的排列为[4,6,7,5],那么其下一段排列应该为[4,7,5,6]

我们可以看到除了首位的4保持不动外,后三位均发生了改变。我们可以把[4,6,7,5]看成是[4,6,5,7] -> [4,7,5,6]

这里的6称为旋转点,我们先把旋转点右边的升序([6,7,5] -> [6,5,7]),然后从升序的子数组里找到到第一个大于旋转点的值,然后交换两者的值

为什么要这么处理呢?我的一个理解是要保证相邻排列是升序的,不如先把旋转点右边的值先排序,至少保证了局部有序,

然后从局部有序的右边数组里面采用二分查找,找到第一个大于旋转点的值,交换即可满足题意。

那怎么定义旋转点呢?

可以从最右边开始往左边找,第一个小于右边相邻的数即为旋转点,如[4,6,7,5]从右边往左边找,第一个小于右边相邻的数为6(6<7, 7>5)

class Solution {
public:
//这个题,怎么说呢
//在于观察吧
//2 4 7 6-> 2 4 6 7->2 6 4 7
//模拟
void nextPermutation(vector<int>& nums) {
int n=nums.size();
if(n<=1) return ; int j=n-2; for(;j>=0;j--){//找到旋转点 if(nums[j]<nums[j+1]) break;
} //把旋转点右边的数组升序
reverse(nums.begin()+j+1,nums.end()); if(j==-1) return ; //找到和旋转点可以替换的点
auto it=upper_bound(nums.begin()+j+1,nums.end(),nums[j]); swap(*it,nums[j]); }
};

leetcode 31. Next Permutation (下一个排列,模拟,二分查找)的更多相关文章

  1. [LeetCode] 31. Next Permutation 下一个排列

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  2. [leetcode]31. Next Permutation下一个排列

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  3. leetCode 31.Next Permutation (下一个字典序排序) 解题思路和方法

    Next Permutation  Implement next permutation, which rearranges numbers into the lexicographically ne ...

  4. [LeetCode] Next Permutation 下一个排列

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  5. 【LeetCode每天一题】Next Permutation(下一个排列)

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  6. LeetCode(31): 下一个排列

    Medium! 题目描述: (请仔细读题) 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列) ...

  7. Next Permutation 下一个排列

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  8. 031 Next Permutation 下一个排列

    实现获取下一个排列函数,这个算法需要将数字重新排列成字典序中数字更大的排列.如果不存在更大的排列,则重新将数字排列成最小的排列(即升序排列).修改必须是原地的,不开辟额外的内存空间.这是一些例子,输入 ...

  9. lintcode:next permutation下一个排列

    题目 下一个排列 给定一个整数数组来表示排列,找出其之后的一个排列. 样例 给出排列[1,3,2,3],其下一个排列是[1,3,3,2] 给出排列[4,3,2,1],其下一个排列是[1,2,3,4] ...

  10. 31. Next Permutation (下一个全排列)

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

随机推荐

  1. 用列表+for循环生成乘法口诀表

    1 # 结合一下列表生成, 准备设计乘法表 2 # numlist = [1,2,3,4,5] 3 # [pow(i,3) for i in numlist] 4 # ## [1, 8, 27, 64 ...

  2. sessionStorage 退出登录删除sessionStorage储存

    1 登录后在sessionStorage中添加token的值,退出后清空 登录后在sessionStorage中添加token的值,退出后清空 localStorage 和 sessionStorag ...

  3. Linux下keepalived配置

    1.背景 节点1:192.168.12.35 节点2:192.168.12.36 2.keepalived安装 使用yum仓库安装keepalived [root@node01 ~]# yum ins ...

  4. Struts2-059 漏洞复现

    0x00 漏洞简介 Apache Struts框架, 会对某些特定的标签的属性值,比如id属性进行二次解析,所以攻击者可以传递将在呈现标签属性时再次解析的OGNL表达式,造成OGNL表达式注入.从而可 ...

  5. jmeter的一些知识目录

    1.JDK安装及环境变量配置2.Jmeter安装及环境变量配置3.如何启动 jmeter 4.下载并安装mysql驱动5.创建JDBC连接池及配置6 .新建线程组及参数配置7.http默认请求及参数配 ...

  6. C#爬虫,让你不再觉得神秘

    1.使用第三方类库 HtmlAgilityPack 官方网址:https://html-agility-pack.net/?z=codeplex. // From File 从文件获取html信息 v ...

  7. xss靶场练习(7.22)

    靶场地址:http://xss.fbisb.com/ 参考的文章:https://www.cnblogs.com/cute-puli/p/10834954.html  感谢大佬的分享 做这个题的思路就 ...

  8. 单身狗福利!利用java实现每天给对象发情话,脱单指日可待!

    引言 最近看到一篇用js代码实现表白的文章,深有感触. 然后发现自己也可以用java代码实现,然后就开始写代码了,发现还挺有意思的,话不多说开搞 实现思路: 使用HttpClient远程获取彩虹屁生成 ...

  9. 作为Java新手,如何才能快速的看透一个Java项目?

    前言 技术学习是一个总结.纠错.触类旁通的过程,而不是单纯重复练习的过程,如果你问一个做过5年以上Java的老码农,他们很多人都会有很强的"搬砖感",这种"搬砖感&quo ...

  10. NET 5使用HangFire定时任务

    注意:1. 当Hangfire服务由Web程序来启用时,默认情况下,web应用程序中的Hangfire服务器实例在第一个用户访问您的站点之前不会启动.甚至,有一些事件会在一段时间后导致web应用程序关 ...