字典排序permutation

理论

C++ 中的next_permutation 一般作为正序全排列的使用规则,其实这个就是正序字典排序的实现。

比如我们要对 列表 [1,2,3]  做full permutation 一般使用递归实现 如下,

 1 static boolean generateP(int index, int high, int[] list) {
 2
 3     if (index == high) {
 4
 5         System.arraycopy(P,0,list,0,list.length);
 6
 7         return true;
 8
 9     }else {
10
11         for (int x = index; x <high; x++) {
12
13             swap(list,list[x],list[index]);
14
15             generateP(index+1,high,list);
16
17             swap(list,list[x],list[index]);
18
19         }
20
21     }
22
23     return false;
24
25 }

下面对字典排序规则说一下

(1)从后往前遍历,找到第一个逆序,比如1,2,4,3 的2,记录位置pos与值value

(2) 如果遍历完也没有找到这个元素说明已经是排序的最后一个了那么从头到尾做reverse 使其他为升序 如4 3 2 1 变为 1->2->3->4;

(3)如果步骤一找到了这个数,那么从后面往前面找到第一大于它的数,并且交换(很多人说从步骤一发现的数开始往后面找是不对的)

步骤3交换后从步骤一发现的的位置后面开始进行头尾的逆序操作。

拆分出来需要三个方法 reverse ,swap,permutation,

板子

 1 static void next_permutation(int[] nums) {
 2
 3     int value = 0, pos = 0;
 4
 5     int i = 0, temp = 0;
 6
 7     for (i = nums.length - 1; i > 0; i--) {
 8
 9         if (nums[i] > nums[i - 1]) {//记录非逆序的第一个数
10
11             value = nums[i - 1];
12
13             pos = i - 1;
14
15             break;
16
17         }
18
19     }
20
21     if (i == 0) {//未发现数那么直接进行逆置
22
23         for (i = 0; i < nums.length / 2; i++) {
24
25             temp = nums[i];
26
27             nums[i] = nums[nums.length - i - 1];
28
29             nums[nums.length - i - 1] = temp;
30
31         }
32
33         return;
34
35     }
36
37     for (int j = nums.length - 1; j > pos; j--) {
38
39         if (value < nums[j]) {//从后往前面找到第一大于非逆序数
40
41             temp = value;
42
43             nums[pos] = nums[j];
44
45             nums[j] = temp;
46
47             break;
48
49         }
50
51     }
52
53     for (i = pos + 1; i < pos + 1 + (nums.length - 1 - pos) / 2; i++) {
54
55         temp = nums[i];//从非逆序数开始进行倒置
56
57         nums[i] = nums[nums.length - 1 - i + pos + 1];
58
59         nums[nums.length - 1 - i + pos + 1] = temp;
60
61     }
62
63 }
64
65  

题目例子:

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

原文地址:https://www.cnblogs.com/dgwblog/p/9130708.html

时间: 2024-08-14 10:37:17

字典排序permutation的相关文章

按照字典排序

按照字典排序, 按照字典的value排序,类似sort -k命令 import operator x = {1:2,3:4, 4:3, 2:1, 0:0} sorted x =sorted(x.iteritems(), key = operator.itemgetter(1)) 0表示根据key排序,1表示根据value排序 In [33]: sorted(x.iteritems(),key=operator.itemgetter(0))                             

字典排序及应用

字典排序: 因为我们都知道字典是无序的,所以也没有想过字典怎么排序,直到--唉 废话不多说,先看按值.按键排序的方法吧. 有一个字典dic1 = {'tired': 1, 'car': 2, 'man': 2, 'of': 1, 'front': 1, 'who': 2, 'in': 1, 'run': 2, 'exhausted': 1, 'get': 2, 'behind': 1} 按值排序:dic2 = sorted(dic1.items(),key=lambda d:d[1],rever

2016.7.30 正则表达式 字典排序

正则表达式:我要匹配字符串中两个引号中的内容 例如 str = '  map.put("abdicate","v.正式放弃(权力.责任):throne"); ' 匹配后要获得 abdicate 以及 v.正式放弃(权力.责任):throne 即引号中的红色内容 正则表达式为\"([^\"]*)\" :[^\"]是指除了"以外的字符 这样就成功得到了需要的内容.注意findall函数的使用 字典排序: key=lamb

&lt;转&gt;python字典排序 关于sort()、reversed()、sorted()

一.Python的排序 1.reversed() 这个很好理解,reversed英文意思就是:adj. 颠倒的:相反的:(判决等)撤销的 print list(reversed(['dream','a','have','I'])) #['I', 'have', 'a', 'dream'] 2.让人糊涂的sort()与sorted() 在Python 中sorted是内建函数(BIF),而sort()是列表类型的内建函数list.sort(). sorted() sorted(iterable[,

C# 字典排序Array.Sort

Array.Sort可以实现便捷的字典排序,但如果完全相信他,那么就容易产生些异常!太顺利了,往往是前面有坑等你. 比如:微信接口,好多地方需要签名认证,签名的时候需要用的字典排序,如果只用Array.Sort()会出现签名异常的情况,而且是偶尔出现. 问题就在于他的排序默认没有区分大小写,这跟微信的签名将不匹配,所以还是需要自己实现比较的方法 public class DictionarySort : System.Collections.IComparer { public int Comp

python 字典排序 关于sort()、reversed()、sorted()

一.Python的排序 1.reversed() 这个很好理解,reversed英文意思就是:adj. 颠倒的:相反的:(判决等)撤销的 print list(reversed(['dream','a','have','I'])) #['I', 'have', 'a', 'dream'] 2.让人糊涂的sort()与sorted() 在Python 中sorted是内建函数(BIF),而sort()是列表类型的内建函数list.sort(). sorted() sorted(iterable[,

华为OJ—火车进站(栈,字典排序)

给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号.要求以字典序排序输出火车出站的序列号.其实也就是输出所有可能的出栈序列. 样例输入: 3 1 2 3 样例输出: 1 2 31 3 22 1 32 3 13 2 1 解答: 其实核心就是一个栈,对于第K个数,在第K个数进栈之前,前面的 K-1 个数要么全部出去了,要么都在栈里面,要么部分在栈里面部分出去了.那么可以假想,在第K个数入栈之前,依次从栈里面出去 0个.1个.2个--栈.si

将参数字典排序,并转为 GET 参数形式.

1.创建 NSString 分类 @interface NSString (WBRequest) - (NSString *)URLEncodedString; - (NSString *)URLEncodedStringWithCFStringEncoding:(CFStringEncoding)encoding; @end @implementation NSString (WBRequest) - (NSString *)URLEncodedString { return [self UR

全排序之字典排序

字典序全排列算法研究 一. 非递归算法(字典序法) 对给定的字符集中的字符规定了一个先后关系,在此基础上规定两个全排列的先后是从左到右逐个比较对应的字符的先后. 例如:字符集{1,2,3},较小的数字位置较先,这样按字典序生成的全排列是 123,132,213,231,312,321 ※ 一个全排列可看做一个字符串,字符串可有前缀.后缀. 生成给定全排列的下一个排列.所谓一个的下一个就是这一个与下一个之间没有其他的.这就要求这一个与下一个有尽可能长的共同前缀,也即变化限制在尽可能短的后缀上. 对