字典排序permutation
理论
C++ 中的next_permutation 一般作为正序全排列的使用规则,其实这个就是正序字典排序的实现。
比如我们要对 列表 [1,2,3] 做full permutation 一般使用递归实现 如下,
static boolean generateP(int index, int high, int[] list) { if (index == high) { System.arraycopy(P,,list,,list.length); return true; }else { for (int x = index; x <high; x++) { swap(list,list[x],list[index]); generateP(index+,high,list); swap(list,list[x],list[index]); } } return false; }
下面对字典排序规则说一下
(1)从后往前遍历,找到第一个逆序,比如1,2,4,3 的2,记录位置pos与值value
(2) 如果遍历完也没有找到这个元素说明已经是排序的最后一个了那么从头到尾做reverse 使其他为升序 如4 3 2 1 变为 1->2->3->4;
(3)如果步骤一找到了这个数,那么从后面往前面找到第一大于它的数,并且交换(很多人说从步骤一发现的数开始往后面找是不对的)
步骤3交换后从步骤一发现的的位置后面开始进行头尾的逆序操作。
拆分出来需要三个方法 reverse ,swap,permutation,
板子
static void next_permutation(int[] nums) { int value = , pos = ; int i = , temp = ; for (i = nums.length - ; i > ; i--) { if (nums[i] > nums[i - ]) {//记录非逆序的第一个数 value = nums[i - ]; pos = i - ; break; } } if (i == ) {//未发现数那么直接进行逆置 for (i = ; i < nums.length / ; i++) { temp = nums[i]; nums[i] = nums[nums.length - i - ]; nums[nums.length - i - ] = temp; } return; } for (int j = nums.length - ; j > pos; j--) { if (value < nums[j]) {//从后往前面找到第一大于非逆序数 temp = value; nums[pos] = nums[j]; nums[j] = temp; break; } } for (i = pos + ; i < pos + + (nums.length - - pos) / ; i++) { temp = nums[i];//从非逆序数开始进行倒置 nums[i] = nums[nums.length - - i + pos + ]; nums[nums.length - - i + pos + ] = temp; } }
题目例子:
Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.
If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).
The replacement must be in-place, do not allocate extra memory.
Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
字典排序permutation的更多相关文章
- C# 字典排序Array.Sort
Array.Sort可以实现便捷的字典排序,但如果完全相信他,那么就容易产生些异常!太顺利了,往往是前面有坑等你. 比如:微信接口,好多地方需要签名认证,签名的时候需要用的字典排序,如果只用Array ...
- python 字典排序 关于sort()、reversed()、sorted()
一.Python的排序 1.reversed() 这个很好理解,reversed英文意思就是:adj. 颠倒的:相反的:(判决等)撤销的 print list(reversed(['dream','a ...
- <转>python字典排序 关于sort()、reversed()、sorted()
一.Python的排序 1.reversed() 这个很好理解,reversed英文意思就是:adj. 颠倒的:相反的:(判决等)撤销的 print list(reversed(['dream','a ...
- java的字典排序
按照教程上的代码还是报错 应该是字典排序的问题,不能是Arrays.sort()
- 排序 permutation
习题2-6 排序 permutation 用1,2,3……9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3.按照“abc def ghi”的格式输出 ...
- php strcmp()字典排序
字典排序(lexicographical order)是一种对于随机变量形成序列的排序方法.其方法是,按照字母顺序,或者数字小大顺序,由小到大的形成序列. 比如,字典中a-z,是依次递增的,a,b,c ...
- 深入Python(1): 字典排序 关于sort()、reversed()、sorted()
http://www.cnblogs.com/BeginMan/p/3193081.html 一.Python的排序 1.reversed() 这个很好理解,reversed英文意思就是:adj. 颠 ...
- 签名:实现参数字典排序,然后拼接为url参数形式
在很多地方请求参数需要做处理例如: 步骤 1.参数字典排序. 2.拼接字符. /// <summary> /// 生成签名 /// </summary> /// <par ...
- python中字典排序,列表中的字典排序
python中字典排序,列表中的字典排序 一.使用python模块:operator import operator #首先要导入模块operator x = {1:2, 3:4, 4:3, 2:1, ...
随机推荐
- 延时加载 lazyload使用技巧
html <img class="lazy" src="images/src_unit.png" data-src="images/index/ ...
- Unity 官方自带的例子笔记 - Space Shooter
首先 买过一本叫 Unity3D开发的书,开篇第一个例子就是大家经常碰见的打飞机的例子,写完后我觉得不好玩.后来买了一本 Unity 官方例子说明的书,第一个例子也是打飞机,但是写完后发现蛮酷的,首先 ...
- OpenCV——PS 滤镜算法之平面坐标到极坐标的变换
// define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ...
- CodeForces - 660F:Bear and Bowling 4(DP+斜率优化)
Limak is an old brown bear. He often goes bowling with his friends. Today he feels really good and t ...
- 【Python】String 字符串
1. split() split()通过指定分隔符对字符串进行切片,如果参数num 有指定值,则仅分隔 num 个子字符串 split()方法语法:str.split(str="" ...
- uC/OS-II源码分析(五)
每个任务被赋予不同的优先级等级,从0 级到最低优先级OS_LOWEST_PR1O,包括0 和 OS_LOWEST_PR1O 在内.当μC/OS-Ⅱ初始化的时候,最低优先级OS_LOWEST_PR1O ...
- 连续4个小时ping不通远端主机,则本机关机
#!/bin/bash #连续4个小时ping不通远端主机,则本机关机. begin_time=$(date "+%s") while true;do sleep 2 ping - ...
- springboot 1.5.x中的动态切换日志级别
logback是一套日志框架,由log4j的优化版,由同一个作者开发,在速度和性能上都超过其他日志框架,再结合slf4j,已成为当前最流行的日志框架. 一.springboot中使用logback s ...
- Swiper 滑动切换图片(可用于PC端,移动端)
作为一名后端的普通程序猿, 你让我搞这种前端不是跟我玩命吗,所以用插件来搞,省事又简单,而且Swiper使用又简单是吧: 头皮发麻,不喜欢说废话,我更喜欢直接看到效果: 按Swiper官方文档来说, ...
- C#设计模式(5)——建造者模式
一.概念 建造者模式将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示. 二.模型 三.代码实现 /// <summary> /// 建造者模式的演变 /// 省略了指挥 ...