下一个排列
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
 
思路:首先观察一个数组     1 2 7 4 3 1 .
他的下一个排列是      1 3 1 2 4 7 。
列举多个这样的数组可以发现规律,
原始数组在从右往左遍历,2,7为 降序排列,在遍历1,3,4,7时都为升序,则找到如下规律:
当遍历发现为降序排列:即nums[i]>nums[i-1]。我们依然从右往左遍历寻找1,2,4,7中第一个比2更大的
数字。
之后交换2 ,3 。 因此 数组变为  1 3 7 4 2 1   可以发现3之后的数组7 4 2 1 从左往右是整齐的降序排列。
因此对其进行逆转。  代码如下:
JAVA:
class Solution {
public void nextPermutation(int[] nums) {
int len=nums.length;
int i,j; //提前获得下标用于后面的swap 交换
for(i=len-2;i>=0;i--){ //这里用len-2,避免了用Len-1之后使用nums[i-1]的尴尬 。或者for(i=nums.size()-1;i>0;i--) 用nums[i]>nums[i-1]
if(nums[i+1]>nums[i]){
for(j=len-1;j>i;j--){ //寻找后面序列总第一个比nums[i]大的数字
if(nums[j]>nums[i])break;
}
int temp=nums[i]; //找到第一个比Nums[i]更大的数,两者交换之后依然是一个整齐的降序数组,因此将其反转
nums[i]=nums[j];
nums[j]=temp;
reverse(nums,i+1,len-1);
return;
}
}
reverse(nums,0,len-1);
} public void reverse(int[] nums,int left,int right){ while(left<right){
int temp=nums[left];
nums[left]=nums[right];
nums[right]=temp;
left++;right--;
}
} }
 
C++:
class Solution {
public:
void reverse1(vector<int>& nums,int l,int r){
while(l<r){
int temp=nums[l];
nums[l]=nums[r];
nums[r]=temp;
l++,r--;
}
}
void nextPermutation(vector<int>& nums) {
int j;
for(int i=nums.size()-;i>;i--){ if(nums[i]>nums[i-]){
for( j=nums.size()-;j>i;j--){
if(nums[j]>nums[i-]){
break;
}
}
swap(nums[i-],nums[j]);
reverse1(nums,i,nums.size()-);
return;
}
}
reverse(nums.begin(),nums.end());
}
};
 

leetcode-下一个排列的更多相关文章

  1. 31,Leetcode下一个排列 - C++ 原地算法

    题目描述 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常 ...

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

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

  3. LeetCode:下一个排列【31】

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

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

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

  5. 【LeetCode】下一个排列【找规律】

    实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. ...

  6. Java实现 LeetCode 31下一个排列

    31. 下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许 ...

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

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

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

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

  9. Leetcode题库——31.下一个排列

    @author: ZZQ @software: PyCharm @file: nextPermutation.py @time: 2018/11/12 15:32 要求: 实现获取下一个排列的函数,算 ...

  10. Leetcode题目31.下一个排列(中等)

    题目描述: 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外 ...

随机推荐

  1. 接口测试Jmeter+Fiddler组合

    接口测试Jmeter+Fiddler组合 在使用完Jmeter在做接口测试之后,个人感觉Jmeter比loadrunner好用,原因是界面操作更加直观,不必像loadrunner在写接口请求函数的时候 ...

  2. 怎样实现一个简单的jQuery编程

    第一步:在head中载入jQuery框架 <script type="text/javascript"  src="jQuery文档所在的绝对路径"> ...

  3. nginx编译问题:make[1]: *** [/usr/local/pcre//Makefile] Error 127

    解决方法: 是由于nginx高版本的需要使用pcre原文件路径. 解压pcre-7.9.tar.gz 例如解压后位置在 /home/wang/pcre-7.9位置 使用nginx配置的时候 ./con ...

  4. H5页面手机端禁止缩放的正确方式

    H5页面禁止手机端缩放是个常见问题了 首先说meta方式 <meta content="width=device-width, initial-scale=1.0, maximum-s ...

  5. 给Extjs的window弹窗的关闭事件添加验证

    问题:我想在window点击右上角叉关闭时添加一些验证,来确定是否关闭? 实现: 首先想到的是拦截window的关闭事件,在它关闭前添加验证,但是有一个问题是,如何阻止它的关闭和组织关闭后,如何让它再 ...

  6. #leetcode刷题之路22-括号生成

    给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n = 3,生成结果为:[ "((()))", "(()())&q ...

  7. 用CSS/CSS3 实现水平居中和垂直居中,水平垂直居中的方式

    一.水平居中 (1)行内元素解决方案:父为块元素+text-align: center 只需要把行内元素包裹在一个属性display为block的父层元素中,并且把父层元素添加如下属性即可: 使用te ...

  8. 请给出如下格式的date命令 例:11-02-26.再给出实现按周输出 比如:周六输出为6,请分别给出命令。

    请给出如下格式的date命令 例:19-01-18.再给出实现按周输出 比如:周六输出为6,请分别给出命令. 解答: 方法1: [root@zhaokang ~]# date2019年 01月 17日 ...

  9. grep基础用法详解

    适合初学linux的人学得比较凌乱的人看这个也能理理思路学得更系统,节约你的学习时间,提高效率,但是思维导图的作用是帮人理清思路不会迷失在细节中,细节补充学习请参考https://www.cnblog ...

  10. 通过SSH服务登陆linux服务器(版本RHEL7)

    通过SSH服务登陆linux服务器(版本RHEL7) SSH服务概述:是一种能够以安全的方式提供远程登陆的协议,也是目前远程管理linux系统的首选方式.在此之前,我们一般使用FTP或者telnet来 ...