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

这题我看了半天都没搞懂啥是"下一个排列(next permutation)".找了些资料(http://www.geeksforgeeks.org/find-next-greater-number-set-digits/),才了解啥叫 next permutation.

这么弄:

假设 A = [2 1 8 7 6 5], 它的 next permutation 咋求? 这样求:

  1. 从右往左,5 6 7 8 都是增序,突然 1 降下来了, 那就所定 1;
  2. 1 右边有 8 7 6 5, 找比1大的但却是这四个数中较小的那个数, 就是 5 喽;
  3. 交换 1 和 5, 结果是 A = [2 5 8 7 6 1];
  4. 然后 对 [8 7 6 1] 增序排序. 最后返回 A = [2 5 1 6 7 8].

打完,收功!

这么做就能得到某序列的所谓的 next permutation 了?

是的!

为啥?

没为啥,遍个程序实现它就完事了!

题目要求中有个特殊情况,就是当 A = [4 3 2 1] 时,返回 A = [1 2 3 4].

以上就是本题的全部解释了.

更加详细的考虑及设置,在我的代码注释中写的很清楚.

人家想法,自个代码:

有个 cpp 副产品: reverse(A.begin() + start, A.end());

这个 start 是 A = [2 1 8 7 6 5] 中元素 8 的 index, start = 2.

\(O(n)\) time, \(O(1)\) extra space.

严格来说,里面用到了排序,就不是\(O(n)\) time 了.

// e.g.
// A = [2 1 8 7 6 5]
// step 1: from right to left, seek element '1';
// step 2: from right to left, seek '5' and swap(A[1], A[5])
// --- After step 2, A = [2 1 8 7 6 5] --> A = [2 5 8 7 6 1]
// step 3: reverse(A.begin() + 2, A.end())
// --- return A = [2 5 1 6 7 8] // special case: A = [4 3 2 1] --> will return A = [1 2 3 4] void nextPermutation(vector<int>& A) {
const int n = A.size();
if (n == 0 || n == 1)
return; //special case int start; // 4 3 2 1, can not found A[i]<A[i+1]
bool found = false; // step 1
for (int i = n - 2; i >= 0; i--) {
if (A[i] < A[i + 1]) {
start = i + 1;
found = true; // found the case A[i]<A[i+1]
break;
}
} // special case
// 4 3 2 1 --> return 1 2 3 4 directly
if (found == false) {
reverse(A.begin(), A.end());
return;
} // step 2
for (int j = n - 1; j >= start; j--) {
if (A[j] > A[start - 1]) {
swap(A[j], A[start - 1]);
break;
}
} // step 3
reverse(A.begin() + start, A.end()); return;
}

31. Next Permutation(中等,搞清楚啥是 next permutation)的更多相关文章

  1. 31. Next Permutation + 46. Permutations + 47. Permutations II + 60. Permutation Sequence

    ▶ 问题:字典序生成有关的问题. ▶ 31. 由当前序列生成字典序里的下一个序列. ● 初版代码,19 ms class Solution { public: void nextPermutation ...

  2. [LeetCode] “全排列”问题系列(二) - 基于全排列本身的问题,例题: Next Permutation , Permutation Sequence

    一.开篇 既上一篇<交换法生成全排列及其应用> 后,这里讲的是基于全排列 (Permutation)本身的一些问题,包括:求下一个全排列(Next Permutation):求指定位置的全 ...

  3. CF785CAnton and Permutation(分块 动态逆序对)

    Anton likes permutations, especially he likes to permute their elements. Note that a permutation of  ...

  4. Codeforces 932 C.Permutation Cycle-数学 (ICM Technex 2018 and Codeforces Round #463 (Div. 1 + Div. 2, combined))

    C. Permutation Cycle   time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  5. Codeforces 500B. New Year Permutation[连通性]

    B. New Year Permutation time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  6. CF 500 B. New Year Permutation 并查集

    User ainta has a permutation p1, p2, ..., pn. As the New Year is coming, he wants to make his permut ...

  7. (转)排列算法 Permutation Generation

    转自:http://www.cnblogs.com/dragonpig/archive/2010/01/21/1653680.html http://www.notesandreviews.com/p ...

  8. Codeforces 612E - Square Root of Permutation

    E. Square Root of Permutation A permutation of length n is an array containing each integer from 1 t ...

  9. cf500B New Year Permutation

    B. New Year Permutation time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

随机推荐

  1. api-gateway实践(08)新服务网关 - 云端发布和日志查看

    一.发布应用 1.新建应用空间 1.1.新建应用空间 1.2.新建应用 1.3.上传程序包 2.创建应用引擎服务 3.发布应用 3.1.为应用容器绑定Web运行环境(应用引擎服务) 3.2.发布应用( ...

  2. 三十天学不会TCP,UDP/IP网络编程 -- RTT的计算

    欢迎去gitbook(https://www.gitbook.com/@rogerzhu/)看到完整版. 如果对和程序员有关的计算机网络知识,和对计算机网络方面的编程有兴趣,虽然说现在这种“看不见”的 ...

  3. Javascript 判断传入的两个数组是否相似

    任务描述: 请在index.html文件中,编写arraysSimilar函数,实现判断传入的两个数组是否相似.具体需求: 1. 数组中的成员类型相同,顺序可以不同.例如[1, true] 与 [fa ...

  4. POJ-2923 Relocation---01背包+状态压缩

    题目链接: https://vjudge.net/problem/POJ-2923 题目大意: 有n个货物,给出每个货物的重量,每次用容量为c1,c2的火车运输,问最少需要运送多少次可以将货物运完 思 ...

  5. 教你用命令行激活win10系统

    对于笔者这样爱自己动手的电脑爱好者来说,当然会选择自己组装一台性价比高的台式电脑,一切都准备就绪了,系统也装好了,就差最后一步了--激活系统. 笔者真的很幸运,在网上找到了一些可以使用的密钥,我装的是 ...

  6. [论文阅读] Deep Residual Learning for Image Recognition(ResNet)

    ResNet网络,本文获得2016 CVPR best paper,获得了ILSVRC2015的分类任务第一名. 本篇文章解决了深度神经网络中产生的退化问题(degradation problem). ...

  7. Thymeleaf3语法详解和实战

    Thymeleaf3语法详解 Thymeleaf是Spring boot推荐使用的模版引擎,除此之外常见的还有Freemarker和Jsp.Jsp应该是我们最早接触的模版引擎.而Freemarker工 ...

  8. Checkbutton

    #tkinter之Checkbutton篇 #Checkbutton又称为多选按钮,可以表示两种状态,On和Off,可以设置回调函数,每当点击此按钮时回调函数被调用. 1.一个简单的Checkbutt ...

  9. Plupload 上传控件使用指南

    本文转载至(感谢原作者分享):http://www.cnblogs.com/2050/p/3913184.html#plupload_doc2 我之前写过一篇文章<文件上传利器SWFUpload ...

  10. 运维技巧-Nginx日志格式

    1.说一说 当你安装完nginx,输出的格式是比较乱的,这样我们就需要自己去定义一下,自己看着舒服的格式. 2.Nginx日志字段 $remote_addr 记录客户端IP,但她的值不是客户端提供的, ...