next_permutation算法(基于交换)

nextpermutation 算法
这个算法如何实现 我们要观察对于任意的123456
对于一个任意的字符串
我们如果要找他的下一个全排列
就应该变动其数字 使得其数值增大 且是最小的增大
那么仅使用以上数字 如何才能使其变大 但变大的数字 是所有变大范围内最小的可能 我们称其为 最小变大


我们看 如果是 1234 下一个数 1243
再来 1243 下一个数是 1342
那么 1342 下一个数是 1423 > 1432
1432 > 2134

像4,43,432这种时候
就需要 把后面的一个数字和前面的一个数字更换
从而实现到最小变大 那么进一步地
我们发现 每次这种变化都是一个递减序列 (如 4,43,432)
把其中最小的数字 和4前面的数字交换 得到一个新序列
因为只有这样才能保证 我们得到新序列才是向“最小变大”

我们需要在后面的递减序列中找到一个比递减序列第一个元素前的
那个元素 我们姑且叫他第0号元素 我们找到一个比0号元素大的
且是最接近0号元素的数字 和 0号交换 才能实现“最小变大“

好了 那么 我们就有代码的思路了
我们发现 任何数串 都可以看成一个后面拖着一个递减序列的数串
无论是什么数字 后面总有一个递减序列 有的是一个元素,有的是多个元素

如何找到他下一个排列?我们要做的是
把递减序列前的第0元素 和递减序列中的比0号元素大且最接近的元素
他俩交换 这样才能实现变大 而且可以推得 递减序列中一定存在元素比第0号元素大

为什么呢? 因为若是不这样 0号元素就在非严格
递减序列里了 所以一定递减序列中有元素比他大
那么 交换完成后就完成任务了吗? 还不够
比如 1342  > 1432 >1423
        1      2     3

我们发现 还需要调整一下才能得到交换后的数串最小
如何调整? 就是要把交换后原来的递减序列从小到大排序才能使其最小
所以我们这里就知道了 由于交换后的0号元素新位置 本来就比0号大
所以仍旧是递减序列

那么就总结为这几个步骤

1 找出递减序列前的第0元素
2 找出递减序列中大于第0元素的最接近元素
3 交换两个元素
4 将0号元素后的序列从小到大排序

我们就得到了他的下一排列

 

模板例题:POJ-3785

题意:就是求下一个排列

 

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
char a[100];
bool Next(int s,int e){int l,j = e-1;while(j>0&&a[j]>=a[j+1])j--; //1if(j==0)return 0;//如果完全逆序 则不必交换 已经是最大可能了for(l = e;a[l]<=a[j];l--);//2swap(a[l],a[j]);//3reverse(a+j+1,a+e+1);//4return 1;
}
int main(){int n;scanf("%d",&n);while(n--){int num;scanf("%d %s",&num,a+1);int len = strlen(a+1);if(Next(1,len))printf("%d %s\n",num,a+1);else printf("%d BIGGEST\n",num);}return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425139.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Vue】【Router】手动跳转用 this.$router.push() 时 $router 未定义的问题

初入Vue&#xff0c;手写路由跳转时的问题&#xff1a; toXxxRoute: () > {this.$router.push({path: /xxx, name: xxx}) } 由于使用了箭头函数&#xff0c;this的指向与传统 js 里不同 所以报错 TypeError: Cannot read property $router of undefined 与其保持一个this变量…

[Letcode]第[34]题[JAVA][在排序数组中查找元素的第一个和最后一个位置][暴力][二分]

【问题描述】[中等] 【解答思路】 1. 线性扫描&#xff08;不符合题意&#xff09; 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(1) class Solution {public int[] searchRange(int[] nums, int target) {int[] targetRange {-1, -1};// find the index of the lef…

习题2-3 求平方与倒数序列的部分和

本题要求对两个正整数m和n&#xff08;m≤n&#xff09;编写程序&#xff0c;计算序列和m​2​​1/m(m1)​2​​1/(m1)⋯n​2​​1/n。 输入格式: 输入在一行中给出两个正整数m和n&#xff08;m≤n&#xff09;&#xff0c;其间以空格分开。 输出格式: 在一行中按照“sum S”的…

用对拍程序来debug错误程序的错误数据

对拍就是通过把自己写的程序的结果和一个完全正确的程序结果进行比较 从而得出自己写的错误程序的漏洞 比如这道题 24点游戏 EOlymp - 44 The number of ones In arithmetic expression you are allowed to use the number 1, operations of addition, multiplication and …

[剑指offer]面试题第[41]题[Leetcode][第235题][JAVA][数据流中的中位数][优先队列][堆]

【问题描述】[困难] 【解答思路】 1. 思路1 时间复杂度&#xff1a;O(logN) 空间复杂度&#xff1a;O(N) import java.util.PriorityQueue;public class MedianFinder {/*** 当前大顶堆和小顶堆的元素个数之和*/private int count;private PriorityQueue<Integer> maxh…

学习笔记,单例

class test(object):flog Noneflog1 Falsedef __new__(cls, *args, **kwargs):if cls.flog is None:cls.flog super().__new__(cls)return cls.flogdef __init__(self):if not test.flog1:print("初始化")test.flog1 Trueabc test() bcd test() print(abc) pri…

SpingBoot+Mybaits+Vue,更新学习

1.DTO 2.实体类 3.Controller层&#xff0c;UpdatePrize/{id}为接口 4.Service层 5.Impl实现层 之后就可以更新数据了。6.Vue链接接口 7.请求&#xff0c;解析&#xff0c;返回值 8.init方法&#xff0c;初始化使用 增删查与更相仿&#xff0c;只是实现层方法不同增加实现层中的…

[剑指offer]面试题第[35]题[Leetcode][第138题][JAVA][复杂链表的复制][暴力][HashMap][复制链表]

【问题描述】[中等] 【解答思路】 1. 暴力 直接复制 将链表从头节点一个一个复制下去&#xff0c; 在根据记录的总长度num&#xff0c;遍历原来的每个节点的random到尾节点个数count&#xff0c;然后顺序遍历找到新链表的该指针在num-count上 。 时间复杂度&#xff1a;O(N^2…

C语言中的四舍六入五成双 和 四舍五入

%.mf 可以让浮点数保留 m 位小数输出 保留的是精度为 四舍六入五成双 就是 5以下舍弃 5以上进位 而当下一位为5时要讨论&#xff1a; 被化简的小数位后面一位的数字等于5时 要看5前面的数字&#xff0c;若是奇数则进位&#xff0c; 若是偶数则将5舍掉&#xff0c;即修约后…

第二十七期:德国工业4.0眼里“工业互联网”与“智能制造”

工业4.0在德国被认为是第四次工业革命&#xff0c;主要是指&#xff0c;在“智能工厂”利用“智能备”将“智能物料”生产成为“智能产品”&#xff0c;整个过程贯穿以“网络协同”&#xff0c;从而提升生产效率&#xff0c;缩短生产周期&#xff0c;降低生产成本。 工业4.0在德…

【复习】快速幂算法详解

快速幂算法 就是求一个高精度幂次取余时的一个快速算法 比如我们要求aba^bab%m的时候 应用于快速幂算法 也就是将O&#xff08;n&#xff09;转化为O&#xff08;logn&#xff09;的算法 他的原理就是&#xff1a; 252^525 2∗2∗2∗2∗22*2*2*2*22∗2∗2∗2∗2 21012^{101}2…

vue监听移动设备的返回事件

在公共方法文件common.js中实现一个存储当前历史记录的方法 common.js // 存储当前历史记录点,实现控制手机物理返回键的按钮事件 var pushHistory function () {let state {title: ,url: }window.history.pushState(state, state.title, state.url) } vue页面 mounted () {p…

[剑指offer]面试题第[36]题[JAVA][二叉搜索树与双向链表][递归]

【问题描述】[中等] 【解答思路】 中序遍历 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(N) class Solution {Node pre, head;public Node treeToDoublyList(Node root) {if(root null) return null;dfs(root);head.left pre;pre.right head;return head;}void …

深度学习第一次课-数学

说明&#xff1a;本文是七月算法5月深度学习班第一次课听课笔记。只记录关键知识点&#xff0c;有些没具体展开。帮助复习用。文中使用了老师课件中的公式。 微积分 导数 定义常用函数导数导数法则加法 乘法 除法 链式法则一元函数与多元函数一阶导 一元函数 f(x) 多元函…

使用CUPS打印服务

目录1. 测试环境 22. CUPS介绍 32.1 CUPS的配置文件 32.1.1 cupsd.conf 32.1.2 cups-files.conf 32.1.3 printcap 32.1.4 printers.conf 32.2 SPOOL假脱机 42.3 CUPS 支持各种打印机&#xff0c;包括&#xff1a; 42.4 CUPS的beh 42.5 使用beh 52.6 安装cups&#xff0c;并激活…

深度学习第三次课-梯度下降与反向传播

梯度下降 损失函数可视化 得分函数 fW*X损失函数 cW*X-y 目标 损失函数最小 最优化过程可视化 一维二维 热力图如果损失函数是一个凸函数&#xff0c;例如SVM。凸函数 正系数加和凸函数神经网络 costfunction 非凸 因为系数有正有负。凸优化与最优化…

[Leetcode][第1025题][JAVA][除数博弈][数学][递推]

【问题描述】[中等] 【解答思路】 1. 数学证明 找规律 时间复杂度&#xff1a;O(1) 空间复杂度&#xff1a;O(1) 2. 递推 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(1) class Solution {public boolean divisorGame(int N) {boolean[] f new boolean[N 5];f[1]…

《App后台开发运维与架构实践》第2章 App后台基础技术

2.1 從App業務邏輯中提煉API接口    業務邏輯思維導圖    功能-業務邏輯思維導圖    基本功能模塊關系    功能模塊接口UML&#xff08;設計出API&#xff09;    在設計稿標注API    編寫API文檔    2.2 設計API的要點    根據對象設計API  …

[Leetcode][第410题][JAVA][分割数组的最大值][动态规划][二分]

【问题描述】[中等] 【解答思路】 1. 动态规划 第 1 步&#xff1a;设计状态 令 f[i][j] 表示将数组的前 i 个数分割为 j 段所能得到的最大连续子数组和的最小值。 &#xff08; i ≥ j &#xff09; 第 2 步&#xff1a;状态转移方程 第 3 步&#xff1a;考虑初始化 f[i][…

深度学习第二课--图像识别与KNN

图像分类的难点 视角不同尺寸不同变形光影背景干扰同类内的差异 例如躺椅、座椅、 图像识别的核心 数据驱动学习。就像人看过很多猫以后&#xff0c;就知道什么是猫。把很多同一类的图片“喂给”计算机&#xff0c;让计算机自己去学习该类图片的特征。之后做出评估。KNN解决…