当前位置: 首页 > news >正文

LeetCode -- Permutation Sequence

题目描述:


The set [1,2,3,…,n] contains a total of n! unique permutations.


By listing and labeling all of the permutations in order,
We get the following sequence (ie, for n = 3):


"123"
"132"
"213"
"231"
"312"
"321"
Given n and k, return the kth permutation sequence.


Note: Given n will be between 1 and 9 inclusive.


对于n,先构造从1到n的数字序列s(例如3,s="123"),对于s的所有全排列情况,求出第k种排列的字符串。
例如对于"123",第3种排列的情况为"213"。


思路:
1.本题属于排列问题,一开始想到的是回溯。可发现题目只要求求出第k种情况,因此没必要track所有的排列状态导致浪费空间,并且这种算法会超时。
2.使用nums[0...n]存放数字1到n(例如"123",nums为{1,2,3}),循环n次,每次从nums中拿走一个元素。试图找到k与(n-1)!的关系,求出每次要拿的索引,每次循环更新k值。


分析:
假设n=4,s为"1234", 要找出第8种排列,
第1轮:先对后面3个元素进行全排列,可以得到3!种排列依然小于8(还差2种),而此时可以拿到第7(即k-1)/3!个元素:n[1]=2。而此时k更新为7%3! = 1;
第2轮:接下来的任务是,从"134"中找到第1/2!个元素,即n[0]=1。k更新为1%2!=1;
第3轮:在"34"中拿到第1/1!个元素,即n[1]=4。对k更新:k=1%1!=0;
第4轮:将最后1个元素n[3]拿出,即3。


最后的结果为"2143"


参考了以下两篇文章的实现:
http://fisherlei.blogspot.sg/2013/04/leetcode-permutation-sequence-solution.html
http://www.programcreek.com/2013/02/leetcode-permutation-sequence-java/


实现代码:


public class Solution {
    public string GetPermutation(int n, int k) 
    {
        var nums = new List<int>();
    	var total = 1;
    	for(var i = 1;i <= n; i++)
    	{
    		total *= i;
    		nums.Add(i);
    	}
    	
    	var ret = "";
    	k--;
    	while(n > 0)
    	{
    		// total represent as (n-1)!
    		total /= n;
    		
    		// take the nums[k / (n-1)!] element
    		var index = k / total;
    		
    		var x = nums[index];
    		ret += x;
    		nums.RemoveAt(index);
    		
    		// next k would be k%(n-1)!
    		k = k % total;
    		
    		n--;
    	}
    	
    	return ret;
    }
}


相关文章:

  • FreeBSD中替换系统调用监视系统文件打开记录
  • LeetCode -- Remove Element
  • 刚做的H1N1猪流感分布图Demo
  • LeetCode -- Same Tree
  • 与辛鹏和王昕聊OPUG(开放流程社区)
  • LeetCode -- Search in Rotated Sorted Array II
  • 小议移动Widget
  • LeetCode -- Search in Rotated Sorted Array
  • LeetCode -- Binary Tree Postorder Traversal
  • 《3G移动增值业务的运营、定制与开发——BREW进阶与精通》开始连载
  • LeetCode -- Course Schedule
  • 七、基本I/O接口电路设计实验
  • LeetCode -- Intersection of Two Linked Lists
  • 红帽的top命令不正确
  • LeetCode -- Minimum Window Substring
  • 【node学习】协程
  • 2017前端实习生面试总结
  • Centos6.8 使用rpm安装mysql5.7
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • PaddlePaddle-GitHub的正确打开姿势
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 如何实现 font-size 的响应式
  • 设计模式 开闭原则
  • 手机端车牌号码键盘的vue组件
  • 算法之不定期更新(一)(2018-04-12)
  • 一个SAP顾问在美国的这些年
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET gRPC 和RESTful简单对比
  • .net程序集学习心得
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)
  • [\u4e00-\u9fa5] //匹配中文字符
  • [1181]linux两台服务器之间传输文件和文件夹
  • [Android Pro] listView和GridView的item设置的高度和宽度不起作用
  • [AutoSar]工程中的cpuload陷阱(三)测试
  • [BUG]Datax写入数据到psql报不能序列化特殊字符
  • [C++提高编程](三):STL初识
  • [C语言]——柔性数组
  • [Editor]Unity Editor类常用方法
  • [emuch.net]MatrixComputations(7-12)
  • [FROM COM张]如何解决Nios II SBTE中出现的undefined reference to `xxx'警告