下一个排列
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
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. Oracle数据库常用命令(持续更新)

    1. 查询当前用户所有的表 select * from user_tables; 2. 查询当前用户能访问的表 select * from all_tables; 3. 获取表字段 select * ...

  2. 【原创】如何设置Virtual Box虚拟机CentOS7为静态IP地址

    如何设置Virtual Box虚拟机CentOS7为静态IP地址 最近要搭建一个Kubernetes集群,需要设置虚拟机为静态IP地址不变.翻了一些资料,参差不齐,有些也比较过时了.自己实测总结了一下 ...

  3. 查询表空间及已使用情況的SQL语句

    语句一: select  f.tablespace_name tablespace_name, round((d.sumbytes / 1024 / 1024 / 1024), 2) total_g, ...

  4. 歌词解析&class

    class song_song: def __init__(self,lrc_file): # 定义两个字典一个列表备用 self.song_file = lrc_file self.song_lrc ...

  5. [NOI2015]软件包管理器(树链剖分,线段树)

    题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个 ...

  6. 完全卸载MySQL数据库,实现重装

    一.在控制面板,卸载MySQL的所有组件 控制面板——>所有控制面板项——>程序和功能,卸载所有和MySQL有关的程序 二.找到你的MysQL安装路径,看还有没有和MySQL有关的文件夹, ...

  7. ElasticSearch优化系列七:优化建议

    尽量运行在Sun/Oracle JDK1.7以上环境中,低版本的jdk容易出现莫名的bug,ES性能体现在在分布式计算中,一个节点是不足以测试出其性能,一个生产系统至少在三个节点以上. ES集群节点规 ...

  8. 嵌入式C语言自我修养 13:C语言习题测试

    13.1 总结 前面12节的课程,主要针对 Linux 内核中 GNU C 扩展的一些常用 C 语言语法进行了分析.GNU C 的这些扩展语法,主要用来完善 C 语言标准和编译优化.而通过 C 标准的 ...

  9. upload-labs19记录

    upload-labs19记录 本次做题为白盒,因为只是fuzz的话并不能学到什么,所以从漏洞源下手. 前端校验 Pass1 源码 function checkFile() { var file = ...

  10. Go语言中映射表map的使用

    1 概述 Go语言中的键值对(key->value)集合,称之为映射map.映射map是变长类型,定义时不需要指定长度.映射map是无序的,遍历是的顺序不可期,原因是底层由hash表实现.逻辑结 ...