【leetcode】31. 下一个排列(next-permutation)(模拟)[中等]

2023-05-16

链接

https://leetcode-cn.com/problems/next-permutation/

耗时

解题:4 h 45 min
题解:13 min

题意

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。

如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

必须原地修改,只允许使用额外常数空间。

思路

实现 C++ 的 next_permutation() 。

从后向前找到第一个非逆序的数字 nums[i],然后在 [i+1,n-1] 里面找大于 nums[i] 的最小的数字 nums[pos],交换 nums[i] 和 nums[pos],然后将 [i+1,n-1] 区间的数字从小到大排序。

如果不存在非逆序的数字,说明不存在下一个更大的排列,直接翻转 nums[] 。

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)

AC代码

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        int n = nums.size();
        if(n <= 1) return ;
        for(int i = n-2; i >= 0; --i) {
            if(nums[i] >= nums[i+1]) continue;
            int tmp = INT_MAX, pos = i;
            for(int j = i+1; j < n; ++j) {
                if(nums[j] > nums[i] && nums[j] < tmp) {
                    tmp = nums[j];
                    pos = j;
                } 
            }
            swap(nums[pos], nums[i]);
            sort(nums.begin()+i+1, nums.end());
            return ;
        }
        reverse(nums.begin(), nums.end());
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【leetcode】31. 下一个排列(next-permutation)(模拟)[中等] 的相关文章

  • 【Leetcode】349. 两个数组的交集

    Leetcode 349 两个数组的交集 题目链接 代码 题目链接 Leetcode 349 两个数组的交集 代码 func intersection nums1 int nums2 int int nums1和nums切片的hash ha
  • 【Leetcode】438. 找到字符串中所有字母异位词

    Leetcode 438 找到字符串中所有字母异位词 题目链接 代码 题目链接 Leetcode 438 找到字符串中所有字母异位词 代码 func findAnagrams s string p string int 枚举p串 统计p串字
  • 从n个列表中生成灯具

    假设我有 N 支球队 如何生成一个赛程列表 其中每支球队都与其他球队比赛 对此的最佳实践是什么 有没有一种已知的算法可以很好地做到这一点 效率并不是真正的必需品 因为它只需要每个赛季产生一次 更具体地说 我将从一些定义开始 我有 N 个团队
  • 在Python中查找给定字符串的所有可能排列[重复]

    这个问题在这里已经有答案了 我有一根绳子 我想通过更改该字符串中字符的顺序来生成该字符串的所有排列 例如 说 x stack 我想要的是这样的列表 l stack satck sackt 目前 我正在迭代字符串的列表强制转换 随机选取 2
  • 「优选算法刷题」:快乐数

    一 题目 编写一个算法来判断一个数 n 是不是快乐数 快乐数 定义为 对于一个正整数 每一次将该数替换为它每个位置上的数字的平方和 然后重复这个过程直到这个数变为 1 也可能是 无限循环 但始终变不到 1 如果这个过程 结果为 1 那么这个
  • 如何根据单元的理想邻里程度重新排序? (进行中)

    我需要帮助来实现一种允许生成建筑计划的算法 这是我最近在阅读 Kostas Terzidis 教授的最新出版物时偶然发现的 2014 CONTEXT 考虑一个被划分为网格系统 a 的站点 b 我们还考虑要在场地范围内放置的空间列表 c 和邻
  • C# 数组列表的排列?

    我有一个 ArrayList myList 我正在尝试创建数组中值的所有排列的列表 示例 所有值都是字符串 myList 0 1 5 3 9 myList 1 2 3 myList 2 93 myList 的计数可以变化 因此它的长度事先未
  • 查找具有重复字母的单词(排列)的排名

    尽管已经发布了很多关于这个问题的文章 但我还是发布了此内容 我不想发布答案 因为它不起作用 这篇文章的答案 查找给定字符串在所有可能的重复排列列表中的排名 https stackoverflow com questions 17620694
  • 如何在 PHP 中查找单词组合

    我有一个数组 new array array c a m t p 现在我想找到单词表中存在的单词组合 我曾尝试实现但没有成功 这是我的 php 代码 words array set powerSet new array 2 mysql ne
  • (任何语言)使用交换查找向量中元素的所有排列

    今天在实验室会议上有人问我这个问题 我们可以想象一个包含元素 1 N 1 长度为 N 的向量 是否存在生成向量中元素的所有排列或顺序的算法 系统 方法 一种建议的方法是交换随机元素 显然 如果存储所有先前生成的排列以供将来参考 那么这将起作
  • 有效地计算组合和排列

    我有一些代码来计算排列和组合 并且我正在努力使其更好地处理大量数字 我找到了一种更好的排列算法 可以避免大量的中间结果 但我仍然认为我可以在组合方面做得更好 到目前为止 我已经提出了一个特殊情况来反映 nCr 的对称性 但我仍然希望找到一种
  • 对(双精度)实数向量进行排序并获得它们

    在 C 中想要对很长的 2 20 实数向量 显然sort 就可以了 在我习惯了 R 的优点之前就已经使用过 Rorder 函数产生导致排序向量的排列 Example x 24 55 22 1 然后是排列 perm 3 2 0 1 贴出原图x
  • Python 中一组列表的所有可能排列

    在 Python 中 我有一个包含 n 个列表的列表 每个列表都有可变数量的元素 如何创建包含所有可能排列的单个列表 例如 a b c d e f I want a d e a d f b d e b d f c d e c d f 注意我
  • 使用javascript在数组中组合单词

    假设我有一个数组 Alex Sam Robert 我想将它们组合起来 例如 获取第一个数组 0 并附加数组 2 这将是 AlexRobert array 0 的第一个字母是 A 并附加 array 2 的第一个字母 即 Robert 这将是
  • Python 字符串的所有可能组合

    你好 我正在使用 python 我正在尝试编写一个方法 其中给定一个字符串 它会找到该字符串的每个组合并将其附加到列表中 我将给出字符串并显示我想要的结果 string x god outcome lst g o d go gd og od
  • Haskell 生成预过滤排列

    有没有办法生成预过滤的排列 而不是这样做 filter condition permutations list 排列函数可以短路 例如 perms perms xs i j i lt xs j lt perms delete i xs 我尝
  • 是否存在可以生成所有可能排列的交换序列? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 给你一个数字列表1 2 n 是否有一
  • 在 R 中生成可能排列的随机、非重复子集

    Given p离散变量 我想随机选择 k他们可能的排列 换句话说 对于变量a in 0 1 and b in 1 2 3 两个随机排列将是 0 2 and 1 3 我想在不首先生成所有可能排列的表的情况下生成这些变量 因为随着变量数量及其可
  • CUDA Thrust 和 sort_by_key

    我正在寻找 CUDA 上的排序算法 它可以对元素数组 A 双精度 进行排序 并返回该数组 A 的键 B 数组 我知道sort by keyThrust 库中的函数 但我希望元素数组 A 保持不变 我能做些什么 我的代码是 void sort
  • 有效地生成所有排列

    我需要尽快生成所有排列 https en wikipedia org wiki Permutation整数的0 1 2 n 1并得到结果作为NumPy https numpy org 形状数组 factorial n n 或者迭代此类数组的

随机推荐