实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须 原地 修改,只允许使用额外常数空间。
例如 1 2 4 3 ->1 3 2 4 就是取一个排列(1234组成的数)中比给出的更大的数

整体实现:

思路:
1.从右往左求第一个非递减值a,在a右边求第一个比他大的值b,两者交换

对应就是 1(2)43 ----2被选中
然后从右侧再找第一比它大的数 ----3被选中 1(2)4(3) ,两者交换,
得到 1 3 4 2
2.b右边单减,右边的值换成单增
对应就是3右边的单减变成单增 42->24
最后得到1 3 2 4

代码1:

var nextPermutation = function (nums) {var len = nums.lengthif (len == 1) {return nums}var a;var a_index = 0;for (let i = len - 1; i >= 0; i--) { //先找第一个非递减值aif (nums[i] > nums[i - 1]) {a = nums[i - 1]a_index = i - 1break} else if (i == 0 && nums[i + 1] < nums[i]) {return nums.reverse()}}for (let j = len - 1; j > a_index; j--) { //右边求出第一个比他大的值b,交换if (nums[j] > a) {nums[a_index] = nums[j]nums[j] = abreak}}let left = a_index + 1 //把右边的值改成单增let right = len - 1while (left < right) {[nums[left], nums[right]] = [nums[right], nums[left]]left++;right--}return nums
};

代码2:

var nextPermutation = function (nums) {var len = nums.lengthif (len == 1) {return nums}let i = nums.length - 2; // 向左遍历,i从倒数第二开始是为了nums[i+1]要存在while (i >= 0 && nums[i] >= nums[i + 1]) { // 寻找第一个小于右邻居的数i--;}var a = nums[i];var a_index = i;for (let i = len - 1; i >= 0; i--) { //先找第一个非递减值aif (nums[i] > nums[i - 1]) {a = nums[i - 1]a_index = i - 1break} else if (i == 0 && nums[i + 1] < nums[i]) {return nums.reverse()}}if (i >= 0) {for (let j = len - 1; j > a_index; j--) { //右边求出第一个比他大的值b,交换if (nums[j] > a) {nums[a_index] = nums[j]nums[j] = abreak}}}let left = a_index + 1 //把右边的值改成单增let right = len - 1while (left < right) {[nums[left], nums[right]] = [nums[right], nums[left]]left++;right--}return nums
};

运行代码:

var nums = [1, 2, 4, 3]
console.log(nextPermutation(nums))

结果如下:

[1,3,2,4]

Finish!!!

JS实现 下一个排列(下一个更大的数)相关推荐

  1. 下一个排列,下一字典序

    下一个排列,下一字典序 题目 实现获取 下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 思路及证 ...

  2. 将一个数组中的值按逆序重新排放。_六十五、下一个更大的数系列,单调栈解决方法...

    「@Author:Runsen」 ❝ 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. 「---- Runsen」 ❞ 据说,放张小姐姐觉得照片可以提高阅读量,图是来源学校 ...

  3. LeetCode 496.下个更大的数

    LeetCode 496. 下一个更大元素 I 给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.请你找出 nums1 中每个元素在 nums2 中 ...

  4. 六十五、下一个更大的数系列,单调栈解决方法

    @Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 据说,放张小姐姐觉得照片可以提高阅读量,图是来源学校的2020新生. ...

  5. 例6-下一个更大的数

    问题描述: 两个不重复的数组nums1和nums2,其中nums1是nums2的子集.在nums2的相应位置找到nums1所有元素的下一个更大数字. nums1中的数字的下一个更大数字是nums2中右 ...

  6. 浅谈怎样建设一个为企业带来更大价值的企业网站

    企业的主页是企业在互联网上展示形象的门户,设计制作一个优秀的网站是企业成功迈向互联网的重要步骤.然而,目前很多企业都有建站的意识,却并没有如何建好一个企业网站的思路.一般说来,企业的网站建设应当遵循着 ...

  7. C语言求一个数组中第k大的数,leetcode | Median of Two Sorted Arrays 寻找2个有序数组中第k大的值...

    There are two sorted arrays A and B of size m and n respectively. Find the median of the two sorted ...

  8. Leetcode-215:求一个数组中第k大的数

    题目描述 给定一个未排序的整数数组,找到其中第k大的数 样例: 给出数组[4,5,1,2,3]和k=3,返回3: 给出数组[7,9,4,5]和k=1,返回9. 要求时间复杂度为O(n),空间复杂度为O ...

  9. 算法12--topK求一个数组中第k大的数

    求一个数组中第k大的值 解法一: 建立一个k个元素的最大堆,首先将数组中前k个元素放入堆中,此时堆顶元素为第k大的元素,后面继续遍历数组,比较堆顶元素与数组中元素值,当数组中元素小于堆顶元素时,将堆顶 ...

最新文章

  1. 学习记录之Focal loss
  2. 浏览器支持java_为什么我下载了java并提示浏览器不支持j
  3. C++ 高级数据类型(二)—— 字符序列
  4. linux can总线接收数据串口打包上传_关于串口,你需要知道这些!!
  5. 项目里面遇到的问题和解决方案的记录
  6. DoIP(二)——报文类型
  7. 基于matlab的声音个数识别
  8. 批处理批量卸载微软补丁
  9. 乔布斯:这九本书每个人都该读一读
  10. c语言厘米换算分米程序设计,厘米和分米换算(米和厘米换算)
  11. java clh_AQS基础——多图详解CLH锁的原理与实现
  12. 《C语言程序设计》第4版 何钦铭、颜晖主编 课后习题答案 第5章 习题5
  13. [elasticsearch笔记] Query DSL - percolate
  14. python调用API轻松实现AI 换脸
  15. linux 命令last -x,查询linux系统重启记录的last命令
  16. 高校逐梦元宇宙,是风口还是噱头?
  17. 后端技术精选 - 收藏集 - 掘金
  18. rsync+xinetd+inotify+sersync
  19. 简单温习一下快速排序
  20. 【网络通信 -- SIP 电话】项目实战记录 -- SIP 服务器 OPENSIPS 搭建测试与 SIP 客户端 PJSIP 编译安装测试

热门文章

  1. outlook从服务器中恢复已删除项目,恢复已删除的Outlook日历项目
  2. TIOBE 编程语言排行,各个语言优缺点,以及你适合那种编程语言
  3. 实时更新:TIOBE世界编程语言排行榜(2021年11月份)
  4. GF1WFV数据预处理
  5. 安装win10系统的详细步骤
  6. C::求一元二次方程的根
  7. python 蓝桥杯--数的读法
  8. 表头让你头疼?看这几招解决Pandas读取Excel表头的问题
  9. typora+坚果云 实现笔记云同步
  10. 系统级应用,重签名后WebView闪退问题