解题思路

下一个数比当前数大 例如 13…>12…将后边的一个比下一个数大的尽可能小的数与下一个数进行交换交换完成后,后面的数升序排列

思路及解法

注意到下一个排列总是比当前排列要大,除非该排列已经是最大的排列。我们希望找到一种方法,能够找到一个大于当前序列的新序列,且变大的幅度尽可能小。具体地:

我们需要将一个左边的「较小数」与一个右边的「较大数」交换,以能够让当前排列变大,从而得到下一个排列。

同时我们要让这个「较小数」尽量靠右,而「较大数」尽可能小。当交换完成后,「较大数」右边的数需要按照升序重新排列。这样可以在保证新排列大于原来排列的情况下,使变大的幅度尽可能小。

以排列 [4,5,2,6,3,1][4,5,2,6,3,1] 为例:

我们能找到的符合条件的一对「较小数」与「较大数」的组合为 22 与 33,满足「较小数」尽量靠右,而「较大数」尽可能小。

当我们完成交换后排列变为 [4,5,3,6,2,1][4,5,3,6,2,1],此时我们可以重排「较小数」右边的序列,序列变为 [4,5,3,1,2,6][4,5,3,1,2,6]。

具体地,我们这样描述该算法,对于长度为 nn 的排列 aa:

首先从后向前查找第一个顺序对 (i,i+1)(i,i+1),满足 a[i] < a[i+1]a[i]<a[i+1]。这样「较小数」即为 a[i]a[i]。此时 [i+1,n)[i+1,n) 必然是下降序列。

如果找到了顺序对,那么在区间 [i+1,n)[i+1,n) 中从后向前查找第一个元素 jj 满足 a[i] < a[j]a[i]<a[j]。这样「较大数」即为 a[j]a[j]。

交换 a[i]a[i] 与 a[j]a[j],此时可以证明区间 [i+1,n)[i+1,n) 必为降序。我们可以直接使用双指针反转区间 [i+1,n)[i+1,n) 使其变为升序,而无需对该区间进行排序。

作者:LeetCode-Solution
链接:https://leetcode.cn/problems/next-permutation/solution/xia-yi-ge-pai-lie-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

public void nextPermutation(int[] nums) {int p=nums.length-2;int leng=nums.length;int i=leng-2,j=leng-1,k=leng-1; // i// 寻找第一个递增序列while (i>=0&&nums[i]>=nums[j]){i--;j--;}//如果找到if (i>=0){// 寻找 【i,n-1】 之间第一个大于 a【i】 的数while (nums[i]>=nums[k]){k--;}// 将一个 不大的大数与一个大的小数 交换int temp=nums[i];nums[i]=nums[k];nums[k]=temp;}// 将【i+1,n】 逆序i=i+1;j=nums.length-1;int temp;while (i<j){temp=nums[i];nums[i]=nums[j];nums[j]=temp;i++;j--;}}

1108_3 H31s数组排列的下一个元素相关推荐

  1. C# 数组增加元素_C语言数组——任意位置插入一个元素

    前言 接着昨天的话题,我们再来看看向C语言的数组中随机插入一个元素的方法. 如果是在python向列表中随机添加元素,我们往往使用insert()的方法. l insert()的第一个参数是位置,第二 ...

  2. 窗口分析函数_14_生成相邻下一个元素

    生成相邻下一个元素 需求描述 需求:将EMP表里的部门编号为20的SAL字段按照由高到低排序取相邻的下一个SAL. 解决方法:通过lag OVER()来完成. 注: 数据库数据集SQL脚本详见如下链接 ...

  3. 找到下一个“元素节点”通用函数

    1 2 3 4 5 6 7 8 9 10 11 //下一个元素节点通用函数 function getNextElement(node){ if(node.nodeType == 1){ return  ...

  4. js删除数组中的某一个元素

    删除数组中的某一个元素,这里写一个普通的办法 首先可以给JS的数组对象定义一个函数,用于查找指定的元素在数组中的位置,即索引,代码为: Array.prototype.indexOf = functi ...

  5. python取数组最后一个元素_Python Json。只获取json数组中的最后一个元素

    我刚开始尝试python,现在我有点左右为难.在 我试图从一个json文档打印,而我只得到数组中的最后一个元素.在[{ "FullMeasure": "1/2 cup&q ...

  6. jquery兄弟标签_js jquery获取当前元素的兄弟级 上一个 下一个元素

    var chils= s.childNodes;  //得到s的全部子节点 var par=s.parentNode;   //得到s的父节点 var ns=s.nextSbiling;   //获得 ...

  7. go 已知有个排序(升序)的数组,要求插入一个元素,最后打印该数组,顺序依然是升序

    // 任意位置插入数字类型的元素 // @param slice []int 将指定元素插入的切片 // @param num int 插入的指定元素 // @param index int 插入的指 ...

  8. php 数组指向下一个值,比较数组值并根据自定义值(PHP)在数组中查找下一个值 - php...

    我正在尝试比较数组中的值,然后根据所选值在数组中选择下一个值. 例如 array(05:11,05:21,05:24,05:31,05:34,05:41,05:44,05:50,05:54); 如果搜 ...

  9. html 获取下一个兄弟节点,js jquery获取当前元素的兄弟级 上一个 下一个元素

    var chils= s.childNodes;  //得到s的全部子节点 var par=s.parentNode;   //得到s的父节点 var ns=s.nextSbiling;   //获得 ...

最新文章

  1. c语言是函数式原型的编程,编程范式|程序世界里的编程范式,探索编程本质
  2. 反转链表:输入一个链表的头结点,反转该链表并输出反转后的链表的头结点。...
  3. 用js自动把url加入ubb代码的函数
  4. 使用tensorflow预测函数的参数值(a simple task)
  5. Boost:字符串转换实例
  6. 文件指针和文件描述符之间的相互转换 fd----fp 和 fp----fd
  7. jquery 修改下拉条 Ben Plum selecter
  8. flex states的用法
  9. FCN-Fully Convolutional Networks
  10. mysql warning 1618_MySQL - 错误1045 - 拒绝访问
  11. mybatis使用collection查询集合属性规则
  12. Ajax Session Timeout处理
  13. 关于Unicode字符集
  14. 启动凤凰系统出现android,凤凰系统重启后出现蓝屏时的解决方法
  15. 树莓派是什么?能干什么?和单片机有什么区别?
  16. ijkplayer源码---FFPlayer结构体4 SDL_Aout
  17. python办公自动化之word表格跨页断行-AllowBreakAcrossPages
  18. java之实现简单的传入一个小数和一个整数,根据传入的整数,输出一个有整数位个小数的小数
  19. Visual Studio 2019(VS2019) 基本操作
  20. 好心情:长期服用抗抑郁药,怎么把肝损伤降到最低?

热门文章

  1. APP推广前景分析-健康助手
  2. Win10全新的图标与用户体验
  3. DNS劫持详解、如何使用网站监控检测dns劫持和网络劫持的特征
  4. SepLUT: Separable Image-adaptive LookupTables for Real-time Image Enhancement
  5. 创建VUE项目时遇到的困难以及解决办法记录
  6. java如何得到项目的webRoot 路径?system.root
  7. power query 生成工资条
  8. 安全对外的接口--加签验签
  9. 社交分享拼团持续走红 如何搭建自己的社交拼团平台?
  10. table 在td标签内实现实心圆