代码题(45)— 下一个排列、第k个排列
1、31. 下一个排列
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1
这道题让我们求下一个排列顺序,有题目中给的例子可以看出来,如果给定数组是降序,则说明是全排列的最后一种情况,则下一个排列就是最初始情况,可以参见之前的博客Permutations 全排列。我们再来看下面一个例子,有如下的一个数组
1 2 7 4 3 1
下一个排列为:
1 3 1 2 4 7
那么是如何得到的呢,我们通过观察原数组可以发现,如果从末尾往前看,数字逐渐变大,到了2时才减小的,然后我们再从后往前找第一个比2大的数字,是3,那么我们交换2和3,再把此时3后面的所有数字转置一下即可,步骤如下:
1 2 7 4 3 1
1 2 7 4 3 1
1 3 7 4 2 1
1 3 1 2 4 7
class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        if(nums.empty())
            return ;
        int n=nums.size();
        int i=n-,j=n-;
        while(i>= && nums[i]>=nums[i+])// 从后向前,找到第一个违反升序的数的位置
            i--;
        if(i>=)
        {
            while(j>= && nums[j]<=nums[i]) // 从后向前,找到第一个大于该数的值的位置
                j--;
            swap(nums[i],nums[j]); // 交换二者的值
        }
        reverse(nums.begin() + i + , nums.end()); //将后面的数重新排序
    }
};
2、60. 第k个排列
给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。
按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:
"123""132""213""231""312""321"
给定 n 和 k,返回第 k 个排列。
说明:
- 给定 n 的范围是 [1, 9]。
 - 给定 k 的范围是[1, n!]。
 
示例 1:
输入: n = 3, k = 3
输出: "213"
示例 2:
输入: n = 4, k = 9
输出: "2314"
我们可以发现,每一位上1,2,3,4分别都出现了6次,当第一位上的数字确定了,后面三位上每个数字都出现了2次,当第二位也确定了,后面的数字都只出现了1次,当第三位确定了,那么第四位上的数字也只能出现一次,那么下面我们来看k = 17这种情况的每位数字如何确定,由于k = 17是转化为数组下标为16。
class Solution {
public:
    string getPermutation(int n, int k) {
        string res;
        string nums = "";
        vector<int> f(n, );
        for (int i = ; i < n; ++i)
            f[i] = f[i - ] * i;
        k--;//因为下标从0开始。
        for (int i = n - ; i >= ; --i)
        {
            int temp = k/f[i];
            k = k%f[i];
            res.push_back(nums[temp]);
            nums.erase(temp, );
        }
        return res;
    }
};
代码题(45)— 下一个排列、第k个排列的更多相关文章
- leetcode31题:下一个排列
		
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. ...
 - LeetCode第496题:下一个更大元素 I
		
问题描述 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nums1 中数字 x ...
 - 代码题(3)— 最小的k个数、数组中的第K个最大元素、前K个高频元素
		
1.题目:输入n个整数,找出其中最小的K个数. 例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 快排思路(掌握): class Solution { public ...
 - WinAPI—— CallNextHookEx调用下一个钩子
		
CallNextHookEx( hhk: HHOOK; {当前钩子的句柄} nCode: Integer; {钩子代码; 就是给下一个钩子要交待的} wParam: WPARAM; ...
 - 一个js程序:离下一个圣诞节还有多少天?
		
话不多说上代码: //离下一个圣诞节还有多少天 var christ=new Date(); christ.setMonth(11); christ.setDate(25); var year=now ...
 - 排列算法汇总(下一个排列,全排列,第K个排列)
		
一.下一个排列 首先,STL提供了两个用来计算排列组合关系的算法,分别是next_permutation和prev_permutation. next_permutation(nums.begin() ...
 - 31、下一个排列 | 算法(leetode,附思维导图 + 全部解法)300题
		
零 标题:算法(leetode,附思维导图 + 全部解法)300题之(31)下一个排列 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: // 方案1 "双指针法 ...
 - 【LeetCode每天一题】Next Permutation(下一个排列)
		
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
 - Leetcode题库——31.下一个排列
		
@author: ZZQ @software: PyCharm @file: nextPermutation.py @time: 2018/11/12 15:32 要求: 实现获取下一个排列的函数,算 ...
 
随机推荐
- mustache模板技术(转)
			
项目首页:http://mustache.github.com/ 项目文档:http://mustache.github.com/mustache.5.html Demo: http://mus ...
 - InnoDB的三个关键特性
			
一.插入缓冲(insert buffer) 对于非聚集索引的插入和更新,不是每一次直接插入索引页中,而是首先判断插入的非聚集索引页是否在缓冲池中,如果在,则直接插入,否则, 先放入一个插入缓冲区中.好 ...
 - ELBO 与 KL散度
			
浅谈KL散度 一.第一种理解 相对熵(relative entropy)又称为KL散度(Kullback–Leibler divergence,简称KLD),信息散度(information dive ...
 - hadoop学习第四天-Writable和WritableComparable序列化接口的使用&&MapReduce中传递javaBean的简单例子
			
一. 为什么javaBean要继承Writable和WritableComparable接口? 1. 如果一个javaBean想要作为MapReduce的key或者value,就一定要实现序列化,因为 ...
 - Python基础(8)_迭代器、生成器、列表解析
			
一.迭代器 1.什么是迭代 1 重复 2 下次重复一定是基于上一次的结果而来 l=[,,,] count= while count < len(l): print(l[count]) count ...
 - PAT 天梯赛 L1-020. 帅到没朋友 【STL】
			
题目链接 https://www.patest.cn/contests/gplt/L1-020 思路 对于每个 K >= 2 的朋友圈,里面的所有 ID 都用 MAP 标记一下 对于每个 K = ...
 - 初学JQuery相关知识点
			
[简单的JQuery]注册事件的函数. $(document).ready(function(){}) [JQuery提供的函数]$.map(array,fn) 对数组array中每个元素调用fn函数 ...
 - arm64的适配问题,这次真醉了
			
写过tableView的童鞋都知道,有必须的两个代理方法要实现,还有几个选择实现的. 必须实现的代理方法: ~设置行数 - (NSInteger)tableView:(UITableView *)ta ...
 - Matlab命令合集 妈妈再也不用担心我不会用matlab了
			
matlab命令 一.常用对象操作:除了一般windows窗口的常用功能键外.1.!dir 可以查看当前工作目录的文件. !dir& 可以在dos状态下查看.2.who 可以查看当前工作空间变 ...
 - hadoop02---高可用网站架构
			
tomcat每个请求都会占用内存cpu,tomcat没有代理功能.nginx是俄国人写的,nginx是静态资源服务器,既可以自己返回请求,也可以做代理进行转发,和负载均衡.Tomcat是动态资源jav ...