当前位置: 首页 > news >正文

【C++】函数next_permutation

学习算法时发现可以使用next_permutation函数来替代手写起到一个全排序的作用。

函数原型

函数定义在<algorithm>头文件中,用于生成给定序列的下一个字典序排列(如果不理解该概念先学习一下字典序的概念)

bool next_permutation( BidirectionalIterator first, BidirectionalIterator last );

参数

  • first: 指向序列起始位置的双向迭代器。
  • last: 指向序列结束位置的双向迭代器(不包含在序列中)。

返回值

  • 如果成功生成下一个排列,返回 true
  • 如果当前序列已经是字典序中的最大排列(即降序排列),则返回false,并将序列重新排列为升序。

示例

使用next_permutation进行全排列并输出结果

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() 
{
    vector<int> nums = {1, 2, 3};

    sort(nums.begin(), nums.end()); // 确保从最小的排列开始

    do 
    {
        for (int num : nums) 
        {
            cout << num << " ";
        }
        cout << endl;
    } 
    while (next_permutation(nums.begin(), nums.end()));

    return 0;
}

输出:

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

原理

  1. 从右向左找到第一个升序对 (i, i+1),即 nums[i] < nums[i+1]。
  2. 再次从右向左找到第一个大于 nums[i] 的元素 nums[j]。
  3. 交换 nums[i] 和 nums[j]。
  4. 反转 i+1 到末尾的子序列。(为了将降序子序列变为升序子序列,从而确保生成的排列是字典序中的下一个排列)
http://www.dtcms.com/a/75867.html

相关文章:

  • 生成式AI红队测试:如何有效评估大语言模型
  • 基于FPGA频率、幅度、相位可调的任意函数发生器(DDS)实现
  • zabbix统计闲置资产
  • HTML课后实践
  • 代码随想录 Day 45 | 【第九章 动态规划part 08】121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III
  • SPI驱动(九) -- SPI_Master驱动程序
  • Netty基础—8.Netty实现私有协议栈一
  • 蓝桥杯练习day1:自除数
  • Linux操作系统应用
  • 【JavaScript】三、数据类型
  • SpringBoot-已添加并下载的依赖,reload和mvn clean 后还是提示找不到jar包问题
  • svn常用命令
  • Spring Data JPA 参数陷阱:从 500 错误到完美解决的奇妙之旅 ✨
  • 【linux】服务器限制客户端ssh访问
  • debian12.9 kde切到x11安装搜狗输入法遇到的问题
  • JUC大揭秘:从ConcurrentHashMap到线程池,玩转Java并发编程!
  • 嵌入式编程优化技巧:do-while(0)、case范围扩展与内建函数
  • 图生视频技术的发展与展望:从技术突破到未来图景
  • Vue.js+Element UI 登录界面开发详解【附源码】
  • Cursor在内网环境配置自定义DeepSeek API
  • opencv中stitch图像融合
  • 学c++的人可以几天速通python?
  • C语言历史
  • ThreadPoolExecutor 源码分析
  • 荣耀手机卸载应用商店、快应用中心等系统自带的
  • Linux 命令:按内存使用大小排序查看 PID 的完全指南
  • Swift实战(微调多模态模型Qwen2.5 vl 7B)
  • 基于香橙派 KunpengPro学习CANN(3)——pytorch 模型迁移
  • JavaScript基础-获取元素
  • Shell脚本中的弱治简写