`

Leetcode - Next Permutation

    博客分类:
  • Math
 
阅读更多
原题链接:https://leetcode.com/problems/next-permutation/
[分析] 参考Code Ganker的思路:1)从低位往高位扫描数组,找到第一个小于其右边数字的位置 p;2)对p分两种情况讨论:a) 若 p >= 0, 即当前数组表示的数并非这个数组能表示的最大数,从p 右边下一个数开始往低位(向右)扫描数组,找到第一个不比p大的下标 q,则 q + 1处是p-q之间比 p 位置上的数字大的最小数,交换 p & q + 1,交换后 p 右边的是一个降序数列,逆序之几位 next permutation。 b) 若 p < 0, 则当前为所有排列中的最大值,逆序整个数组得到最小值。 如何理解这个思路的正确性?步骤1找到的p,其后面是一个降序数列,是后面那些数字排列能得到的最大值,也就是后面无论怎么排列都不可能使整个数组值更大,这说明是时候替换这段子序列前面那个领头数字了,从子序列中找一个比当前领头(p位置的数字)大的最小数字作为新领头,子序列再逆序下,这样得到的新排列是比之前排列对应数值大的最小排列。
实现时注意第一个while里头是 >=,因为我们要找到第一个破坏非降序性质的位置,第二个while里头是 >, 因为要通过找到第一个不比p大的数来找到大于 p 的最小数。
[ref]
http://blog.csdn.net/linhuanmars/article/details/20434115?utm_source=tuicool

public class Solution {
    public void nextPermutation(int[] nums) {
        if (nums == null || nums.length < 2)
            return;
        int p = nums.length - 2;
        while (p >= 0 && nums[p] >= nums[p + 1])
            p--;
        if (p >= 0) {
            int q = p + 1;
            while (q < nums.length && nums[q] > nums[p])
                q++;
            int tmp = nums[--q];
            nums[q] = nums[p];
            nums[p] = tmp; 
        } 
        reverse(nums, p + 1);
    }
    public void reverse(int[] nums, int i) {
        int j = nums.length - 1;
        while (i < j) {
            int tmp = nums[j];
            nums[j] = nums[i];
            nums[i] = tmp;
            i++;
            j--;
        }
    }
}
分享到:
评论

相关推荐

    js-leetcode题解之31-next-permutation.js

    js js_leetcode题解之31-next-permutation.js

    leetcode-cpp刷题

    - **2.1.12 Next Permutation** - 寻找下一个更大的排列。 - 实现思路:从右向左扫描数组,找到第一个下降位置,然后交换该位置及其右侧的最大值,最后将右侧部分反转。 - **2.1.13 Permutation Sequence** - ...

    java-leetcode题解之Next Permutation.java

    java java_leetcode题解之Next Permutation.java

    leetcode-常见考题2.pdf

    - 在 NextPermutation 题目中,需要使用递归或迭代来寻找给定数列的下一个全排列。 这些知识点构成了算法面试的主要考察内容,应聘者如果能熟练掌握这些知识,将有助于在IT行业的面试中获得更好的表现。

    戳气球leetcode-leetcode:leetcode

    leetcode category other hot keywords:Palindrome(mic), Subsequence Array 螺旋矩阵Spiral Matrix 顺时针打印矩阵 Next Permutation Product of Array Except Self 189.rotate-array 283.move-zero Range Sum ...

    最低加油次数leetcode-Leetcode:力码

    最低加油次数 ...Next_permutation Stack, trick trick TOP 类似斐波拉契,一层层处理 字符串处理 TOP 完全背包 dfs Trick TOP next_permutation dfs or stl next_permutation dfs or stl TOP 排序后的字符串作

    lrucacheleetcode-leetcode-journal:记录所有LeetCode挑战的存储库

    lru缓存leetcode 力扣日记 欢迎来到我的 LeetCode 期刊库。 我的每个问题都将包括一个初始计划阶段,在这个阶段我将用我自己的话来...Permutation (Medium) 34. Find First and Last Position of Element in Sorted Arr

    31.Next Permutation 下一个排列【LeetCode单题讲解系列】

    31.Next_Permutation_下一个排列【LeetCode单题讲解系列】

    leetcode答案-exercise-book:算法练习记录

    Permutation 解决方法:掌握排列组合的字典序规律,即可。这个规律找不到,我最后还是直接看答案的。 LeetCode: 581. Shortest Unsorted Continuous Subarray 解决方法:无序列中最大最小值 2018-08-17 19:47 ...

    leetcode1004-leetcode:leetcode

    Permutation (M) * -&gt; index 주의, 부등호 하나 틀림 33. Search in Rotated Sorted Array (M) * -&gt; 부등호 주의, 부등호 하나 틀림 34. Find First and Last Position of Element in Sorted Array (M) 35. Search ...

    LeetCode最全代码

    # [LeetCode](https://leetcode.com/problemset/algorithms/) !... Up to date (2016-12-18), there are `447` Algorithms / `13` ...31 | [Next Permutation](https://leetcode.com/problems/next-permutation/)| ...

    leetcode最大连通域-leetcode:leetcode

    next_permutation.py - 将数字重新排列为按字典顺序排列的下一个更大的数字排列 permutations2.py - 返回所有可能的唯一排列 3sum_2.py - 查找数组中所有唯一的三元组,其总和为零。 3sum.py - 查找数组中所有唯一的...

    leetcode中国-leetcode:力码

    leetcode中国 LeetCode | LuoGu 题型记录 P1980 计数问题 (数位dp, 朴素算法) P1047 校门外的树 (线段树, ...全排列问题(next_permutation, dfs(最主要需要记住,置位后需要清0(f[i]=0))) P3392 涂国旗(组合) P23

    leetcode2sumc-Leetcode_imp_C:Leetcode在C上的实现

    leetcode_0031_next_permutation.c leetcode_0033_search_rotate.c : binary search, offer11 81 leetcode_0034_first_last_pos.c : binary search leetcode_0035_search_inseart.c : binary search leetcode...

    Leetcode答案(c++版)

    **1.28 Next Permutation (31)** - **问题描述**:实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 - **解题思路**: - 从后向前找到第一个升序对 (nums[i-1], nums[i])。...

    Leetcode题目+解析+思路+答案.pdf

    - **Populating Next Right Pointers in Each Node**:连接二叉树每个节点的下一个右侧节点。 - **Convert Sorted List/Array to Binary Search Tree**:将有序列表或数组转换为二叉搜索树。 - **Path Sum II**:...

    leetcode分类-contest.js:准备比赛使用!纯JavaScript中的数据结构和算法,零依赖

    nextPermutation 等。 : KMP, RabinKarp : 路径压缩、按秩合并。 : 质数测试、筛选等。 : 阶乘、模阶乘、二项式系数、帕斯卡三角。 : 欧几里得公约数,扩展欧几里得,模拟元。 : create2DArray, create3DArray, ...

    leetcode装最多水-Leetcode:解决了leetcode问题

    Permutation 算法也可用于迭代地查找数组的排列。 也可用于迭代查找数组的排列。 13 . 14 . 15 . 16 . 17 . Algorithm to find kth largest element from an unsorted array in linear time. (1) If the number of ...

    leetcode最大蓄水量-leetcode_note_book:leetcode题目分类及刷题总结

    NextPermutation 下一排序 完成 DFS 题目 说明 状态 NumIslands 岛屿数量 完成 DivideAndConquer 题目 说明 状态 MaxSubArray 最大子序和 完成 Back Tracing 题目 说明 状态 GenerateParenthesis 括号生成 完成 ...

Global site tag (gtag.js) - Google Analytics