Next Permutation

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

If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).

The replacement must be in-place, do not allocate extra memory.

Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

题目意思:

给定一组数字,求他的下一个排列。如果已经是最大的排列了,那么就把他调整成最小的排列。而且必须是在num数组中原地调整,不能增加额外的内存分配。

解题思路:

又是一道全排列的题目,我突然就想到了之前的那个求Permutation的题,于是乎第一反应就是不管三七二十一先把你所有的排列都求出来然后存起来,跟给定的排列比较,然后按顺序的下一个就是了。转念一想这样太麻烦了,况且题目还要求了不能分配额外的内存了,所以不可行。

在网上研究了别人解题的算法,大概是这样子的。以num(6 5 4 8 7 5 1)举例:

第一步:先从后往前找,8,7,5,1都是降序排列,我们先找到出现升序的那个地方。即num[2]和num[3],此时我们假设index的值为3。

第二步:在num[index]~num[len-1]中找到比num[2]大的最小数。即num[5]。下标记为exchangeIndex。

第三步:交换num[index-1]和num[exchangeIndex]的值。

第四步:重新调整num[index]~num[len-1]为升序序列。

代码如下:

 class Solution {
public:
void nextPermutation(vector<int> &num) {
int index = num.size() - ;
//从右边开始找到第一个不是降序的下标。index值为一对升序数中较大的下标
while(index > ){
if(num[index] > num[index - ]){
break;
}
index--;
}
//如果没有下一个排列,index为0
if(index == ){
sort(num.begin(),num.end());
return ;
}
//在index往后的数字里(降序)找到比[index-1]大的最小的数,下标为exchangeIndex
int exchangeIndex;
for(int i = num.size()-; i >= index; i--){
if(num[i] > num[index-]){
exchangeIndex = i;
break;
}
}
//交换这两个数
swap(num[index-],num[exchangeIndex]);
//index及以后的数字重新按升序排列。
sort(num.begin()+index,num.end()); }
};

【LeetCode练习题】Next Permutation的更多相关文章

  1. 【LeetCode练习题】Permutation Sequence

    Permutation Sequence The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and ...

  2. [array] leetcode - 31. Next Permutation - Medium

    leetcode - 31. Next Permutation - Medium descrition Implement next permutation, which rearranges num ...

  3. LeetCode 31 Next Permutation / 60 Permutation Sequence [Permutation]

    LeetCode 31 Next Permutation / 60 Permutation Sequence [Permutation] <c++> LeetCode 31 Next Pe ...

  4. Leetcode练习题Remove Element

    Leetcode练习题Remove Element Question: Given an array nums and a value val, remove all instances of tha ...

  5. [LeetCode] 267. Palindrome Permutation II 回文全排列 II

    Given a string s, return all the palindromic permutations (without duplicates) of it. Return an empt ...

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

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

  7. LeetCode 31. Next Permutation (下一个排列)

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

  8. 【一天一道LeetCode】#60. Permutation Sequence.

    一天一道LeetCode系列 (一)题目 The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and ...

  9. LeetCode 266. Palindrome Permutation (回文排列)$

    Given a string, determine if a permutation of the string could form a palindrome. For example," ...

随机推荐

  1. Linux系统编程(19)——正则表达式在sed和awk中的使用

    sed意为流编辑器(Stream Editor),在Shell脚本和Makefile中作为过滤器使用非常普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出.sed和 ...

  2. bzoj1645 [Usaco2007 Open]City Horizon 城市地平线

    Description Farmer John has taken his cows on a trip to the city! As the sun sets, the cows gaze at ...

  3. web前端设计:JQuery MINI UI

    JQuery MINIUI 个人感觉用起来很爽,所以在此记录之,以后开发过程可能作为备选项.它能缩短开发时间,减少代码量,使开发者更专注于业务和服务端,轻松实现界面开发,带来绝佳的用户体验.在线下载地 ...

  4. UESTC_神秘绑架案 CDOJ 881

    神秘绑架案 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Sta ...

  5. django项目环境搭建备忘

    由于使用python3,所以尽量为每个项目配置虚拟环境来管理各个项目的=. 新建一个项目文件夹,进入该路径 python3 -m venv ll_env 然后激活虚拟环境 source ll_env/ ...

  6. 解决红米等手机(移动端)无法触发touchend事件

    触屏事件的简单描述: js的触屏事件,主要有三个事件:touchstart,touchmove,touchend. 这三个事件最重要的属性是 pageX和 pageY,表示X坐标,Y坐标.touchs ...

  7. hdu 3954 Level up(线段树)

    题目链接:hdu 3954 Level up 题目大意:N个英雄,M个等级,初始等级为1,给定每一个等级须要的经验值,Q次操作,操作分两种,W l r x:表示l~r之间的英雄每一个人杀了x个怪物:Q ...

  8. C#主要字典集合性能对比[转]

    A post I made a couple days ago about the side-effect of concurrency (the concurrent collections in ...

  9. 自学HTML的几个例子

    此处不赘述HTML中不同标签的用法仅仅给出自己学习时写的一些自娱自乐的例子,具体标签用法请参考W3C(http://www.w3school.com.cn/),毕竟这个才是最靠谱的,请不要相信任何二道 ...

  10. css系列教程--简介及基础语法和注意事项

    css简介:css指的是层叠样式表,cascading style sheets.用来定义html中的dom节点如何展示在页面中的问题.解决了内容与表现形式的分离问题.常见的样式表有外部链接样式表和内 ...