一、题目说明

题目是31. Next Permutation,英文太差看不懂,翻译了一下。才知道是求字典顺序下的下一个排列,不允许使用额外空间。题目难度是Medium!

二、我的实现

首先要进一步理解题目,以1->2->3为例,字典顺序如下:

(1) 1->2->3;
(2) 1->3->2;
(3) 2->1->3;
(4) 2->3->1;
(5) 3->1->2;
(6) 3->2->1;
(7) 1->2->3;

如何从(1)-> (2) ->(3)-> (4) ->(5)-> (6) ->(7)实现状态转换?以(3)->(4)为例:

从列表lists的最右边起,

if(lists[t] < lists[t-1]) {

​ swap(lists[t-1],max{lists[t]...lists[listSize-1]})

​ sort(lists[t],lists[listSize-1]);

}

从(6)->(7),sort(lists[0],lists[listSize-1])即可。

代码如下:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std; class Solution {
public:
void nextPermutation(vector<int>& nums){
if(nums.size()<=1) return ;
bool flag = false;
for(int t=nums.size()-1;t>0;t--){
if(nums[t]>nums[t-1]){
//find the smallest between nums[t] to nums[t-1]
flag = true;
int max = nums[t];
int maxIndex = t; for(int k=nums.size()-1;k>=t;k--){
if(nums[t-1]<nums[k]){
max = nums[k];
maxIndex = k;
break;
}
}
int tmp = nums[t-1];
nums[t-1] = nums[maxIndex];
nums[maxIndex] = tmp; //从t..size()-1重新排序
int len = nums.size()-t;
for(int s=0;s<(len+1)/2;s++){
tmp = nums[t+s];
nums[t+s] = nums[nums.size()-s-1];
nums[nums.size()-s-1] = tmp;
}
break;
}
}
if(!flag){
int tmp,len = nums.size();
for(int t=0;t<(len+1)/2;t++){
tmp = nums[t];
nums[t] = nums[len-t-1];
nums[len-t-1] = tmp;
}
}
}
};
int main(){
Solution s;
vector<int> v; v = {1,3,2};
s.nextPermutation(v);
for(vector<int>::iterator it=v.begin();it!=v.end();it++){
cout<<*it<<" ";
}
cout<<endl; v = {5,4,7,5,3,2};
s.nextPermutation(v);
for(vector<int>::iterator it=v.begin();it!=v.end();it++){
cout<<*it<<" ";
}
cout<<endl; v = {3,2,1};
s.nextPermutation(v);
for(vector<int>::iterator it=v.begin();it!=v.end();it++){
cout<<*it<<" ";
}
cout<<endl; v = {1,5,1};
s.nextPermutation(v);
for(vector<int>::iterator it=v.begin();it!=v.end();it++){
cout<<*it<<" ";
}
cout<<endl; return 0;
}

三、改进措施

提交后,性能如下:

Runtime: 8 ms, faster than 78.45% of C++ online submissions for Next Permutation.
Memory Usage: 8.6 MB, less than 88.17% of C++ online submissions for Next Permutation.

差不多了,就不优化了。

刷题31. Next Permutation的更多相关文章

  1. leecode刷题(31) -- 回文数

    leecode刷题(31) -- 回文数 回文数 判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输 ...

  2. 【leetcode刷题笔记】Permutation Sequence

    The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  3. 面试刷题31:分布式ID设计方案

    面试中关于分布式的问题很多.(分布式事务,基本理论CAP,BASE,分布式锁)先来一个简单的. 简单说一下分布式ID的设计方案? 首先要明确在分布式环境下,分布式id的基本要求. 1, 全局唯一,在分 ...

  4. 刷题46. Permutations

    一.题目说明 题目是46. Permutations,给一组各不相同的数,求其所有的排列组合.难度是Medium 二.我的解答 这个题目,前面遇到过类似的.回溯法(树的深度优先算法),或者根据如下求解 ...

  5. 牛客网刷题(纯java题型 31~60题)

    牛客网刷题(纯java题型 31~60题) 重写Override应该满足"三同一大一小"三同:方法名相同,参数列表相同,返回值相同或者子类的返回值是父类的子类(这一点是经过验证的) ...

  6. C#LeetCode刷题-数组

    数组篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 43.1% 简单 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组 ...

  7. 剑指offer刷题

    1.面试题43. 1-n整数中1出现的次数 输入一个整数 n ,求1-n这n个整数的十进制表示中1出现的次数. 例如,输入12,1-12这些整数中包含1 的数字有1.10.11和12,1一共出现了5次 ...

  8. leetcode刷题总结一

    大四狗找工作,要刷题了,leetcode上面题目比较适合面试算法类题目,也不纯粹为了蒙题,锻炼一下面试类型的思维 Single Number: 有N个数,其中只有一个数出现了一次,其他都是两次,找出那 ...

  9. 31. Next Permutation

    题目: Implement next permutation, which rearranges numbers into the lexicographically next greater per ...

随机推荐

  1. sklearn的train_test_split()各函数参数含义解释(非常全)

    sklearn之train_test_split()函数各参数含义(非常全) 在机器学习中,我们通常将原始数据按照比例分割为“测试集”和“训练集”,从 sklearn.model_selection ...

  2. greenplum 存储过程 函数

    参考:https://docs.pivotal.io/search?q=function

  3. greenplum 存储过程 变量类型

    参考: https://www.cnblogs.com/kungfupanda/p/4478917.html

  4. 网络OSI七层模型及各层作用 与 TCP/IP

    背景 虽然说以前学习计算机网络的时候,学过了,但为了更好地学习一些物联网协议(MQTT.CoAP.LWM2M.OPC),需要重新复习一下. OSI七层模型 七层模型,亦称OSI(Open System ...

  5. Ubuntu 19.10将使用GCC 9作为默认编译器

    作为我们这一周期一直期待的变化,Ubuntu 19.10升级到GCC 9作为GCC 8的默认系统编译器. Ubuntu 19.10(和Ubuntu 20.04 LTS)将使用GCC 9 stable作 ...

  6. oracle 实现主键id自增

    公司现在项目数据库使用oracle,oracle实现表主键自增比mysql麻烦 mysql 在表主键auto_increment 打钩即可.oracle没有改属性,就相对麻烦.特此记录一下自增方法 测 ...

  7. 洛谷 P2634 聪聪可可

    题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已 ...

  8. 002. 使用IDEA创建MyBatis的JAVAWEB项目 ,每一步都有详细过程,完美绕过各种坑能正常运行

    001. 我们新建一个Module,相当于一个工程里面的一个项目 002.选择空白的JAVA程序 003.输入项目的名字为mybatis001 004.我们对这个项目添加Support,各种框架依赖 ...

  9. 《新标准C++程序设计》4.6(C++学习笔记16)

    重载流插入运算符和流提取运算符 流插入运算符:“<<” 流提取运算符:“>>” cout 是在 iostream 中定义的,ostream 类的对象. “<<” 能 ...

  10. validate表单验证-单独验证

    今天编写一个表单验证程序,我来说一下今天遇到的坑:程序不是通过submit按钮提交验证的,是在自己写的一个方法中提交的,出现了表单无法验证的情况.然后我就了解了一下jquery validate的验证 ...