题目链接

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. mysql 8.0忘记root密码

    1.修改参数文件添加以下内容 skip-grant-tables 2.关闭数据库 [root@node01 ~]# /etc/init.d/mysqld8 stop Shutting down MyS ...

  2. [日常摸鱼]poj1509Glass Beads-SAM

    QAQ学了好几天了-(我太傻啦) #include<cstdio> #include<cstring> #define rep(i,n) for(register int i= ...

  3. Python的一个mysql实例

    按公司名统计一定时期内入货的总车数,总重量还有总价格.数据表如下: 要用到的库是pymysql,读取excel表格的xlrd,写入excel的xlwt和复制excel模板的xlutils,代码如下: ...

  4. webform中jQuery获取checkboxlist的value值

    后台绑定 /首先,在绑定checkboxlist时,为ListItem每个对象添加一个alt属性,值保存对应的value值,代码如下 if(dt != null && dt.Rows. ...

  5. JavaScript 正则匹配中文,中文符号,空格,全数字,以https:// 开头的url,用于各种场景的输入校验

    业务场景1: 密码输入框需要验证输入中文,中文符号,空格等情况,以便于给出错误提示 业务场景2: 输入框只允许输入数字的情况 业务场景3: 输入框允许输入均为数字或以https:// 开头的url的情 ...

  6. Vue开发中的一些常见套路和技巧

    属性排放 export default { name: '名称', components: { // 组件挂载a}, created(){} // 数据获取 beforeMount() {}, // ...

  7. 96. Unique Binary Search Trees1和2

    /* 这道题的关键是:动态表尽量的选取,知道二叉搜索树中左子树的点都比根节点小,右子树的点都比根节点大 所以当i为根节点,左子树有i-1个点,右子树有n-i个点,左右子树就可以开始递归构建,过程和一开 ...

  8. Pytest测试框架(一):pytest安装及用例执行

    PyTest是基于Python的开源测试框架,语法简单易用,有大量的插件,功能非常多.自动检测测试用例,支持参数化,跳过特定用例,失败重试等功能. 安装 pip install -U pytest  ...

  9. Docker之1---介绍和安装

    Docker介绍 Docker是一个开源项目,让应用程序布署在软件货柜下的工作可以自动化进行,借此在Linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制. Docker利 ...

  10. SpringSecurity配置文件

    @EnableWebSecurity public class seccurityConfig extends WebSecurityConfigurerAdapter { @Override pro ...