一、题目说明

题目是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. SPringBootJPA的使用快速开发

    一文搞懂如何在 Spring Boot 中正确使用 JPA JPA 这部分内容上手很容易,但是涉及到的东西还是挺多的,网上大部分关于 JPA 的资料都不是特别齐全,大部分用的版本也是比较落后的.另外, ...

  2. 前端学习笔记系列一:2 Vue的单文件组件

    (1)非单文件vue组件和单文件vue组件的一般写法 一个完整的vue组件会包括三个部分:一是template模板部分,二是js程序逻辑部分,三是css样式部分.每个组件都有属于自己的模板,js和样式 ...

  3. python表白实现代码(可视化与动画版)

    python表白实现代码(可视化与动画版)如何优雅而又高大上地对自己的心爱女神表白了? ? ? 试试python表白的实现方式吧,是动画版的哦,保证可以如你所愿 ! ! !最终的实现效果如下: 具体实 ...

  4. Ubuntu指令

    cd ~ 进入桌面 cd /进入计算机 mkdir 创建文件夹 mv移动文件  mv 源文件 目标文件 记得前面加/.

  5. matlab练习程序(快速搜索随机树RRT)

    RRT快速搜索随机树英文全称Rapid-exploration Random Tree,和PRM类似,也是一种路径规划算法. 和PRM类似,算法也需要随机撒点,不过不同的是,该算法不是全局随机撒点,而 ...

  6. 013.Delphi插件之QPlugins,模块化代码示例

    这个DEMO的是一个定义了一个窗体插件接口,把其他窗口注册到这个窗体插件接口中.主程序运行起来,就遍历一下窗体插件接口,把每个窗体内嵌到对话框中 运行效果如下 主窗口代码如下 unit Frm_Mai ...

  7. mysq 数据库约束入门

  8. 自己写个tween

    public Vector3 begin,end;//起始终止坐标 public float BtoE_time;//用时 float timer,lerp;//计时器和进度值 void Update ...

  9. Nifi简介及核心概念整理

    简介 Apache NiFi 是一个易于使用.功能强大而且可靠的数据拉取.数据处理和分发系统,用于自动化管理系统间的数据流. 它支持高度可配置的指示图的数据路由.转换和系统中介逻辑,支持从多种数据源动 ...

  10. 吴裕雄--天生自然java开发常用类库学习笔记:定时调度

    // 完成具体的任务操作 import java.util.TimerTask ; import java.util.Date ; import java.text.SimpleDateFormat ...