JS实现 下一个排列(下一个更大的数)
实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须 原地 修改,只允许使用额外常数空间。
例如 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实现 下一个排列(下一个更大的数)相关推荐
- 下一个排列,下一字典序
下一个排列,下一字典序 题目 实现获取 下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 思路及证 ...
- 将一个数组中的值按逆序重新排放。_六十五、下一个更大的数系列,单调栈解决方法...
「@Author:Runsen」 ❝ 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. 「---- Runsen」 ❞ 据说,放张小姐姐觉得照片可以提高阅读量,图是来源学校 ...
- LeetCode 496.下个更大的数
LeetCode 496. 下一个更大元素 I 给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.请你找出 nums1 中每个元素在 nums2 中 ...
- 六十五、下一个更大的数系列,单调栈解决方法
@Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 据说,放张小姐姐觉得照片可以提高阅读量,图是来源学校的2020新生. ...
- 例6-下一个更大的数
问题描述: 两个不重复的数组nums1和nums2,其中nums1是nums2的子集.在nums2的相应位置找到nums1所有元素的下一个更大数字. nums1中的数字的下一个更大数字是nums2中右 ...
- 浅谈怎样建设一个为企业带来更大价值的企业网站
企业的主页是企业在互联网上展示形象的门户,设计制作一个优秀的网站是企业成功迈向互联网的重要步骤.然而,目前很多企业都有建站的意识,却并没有如何建好一个企业网站的思路.一般说来,企业的网站建设应当遵循着 ...
- 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 ...
- Leetcode-215:求一个数组中第k大的数
题目描述 给定一个未排序的整数数组,找到其中第k大的数 样例: 给出数组[4,5,1,2,3]和k=3,返回3: 给出数组[7,9,4,5]和k=1,返回9. 要求时间复杂度为O(n),空间复杂度为O ...
- 算法12--topK求一个数组中第k大的数
求一个数组中第k大的值 解法一: 建立一个k个元素的最大堆,首先将数组中前k个元素放入堆中,此时堆顶元素为第k大的元素,后面继续遍历数组,比较堆顶元素与数组中元素值,当数组中元素小于堆顶元素时,将堆顶 ...
最新文章
- 学习记录之Focal loss
- 浏览器支持java_为什么我下载了java并提示浏览器不支持j
- C++ 高级数据类型(二)—— 字符序列
- linux can总线接收数据串口打包上传_关于串口,你需要知道这些!!
- 项目里面遇到的问题和解决方案的记录
- DoIP(二)——报文类型
- 基于matlab的声音个数识别
- 批处理批量卸载微软补丁
- 乔布斯:这九本书每个人都该读一读
- c语言厘米换算分米程序设计,厘米和分米换算(米和厘米换算)
- java clh_AQS基础——多图详解CLH锁的原理与实现
- 《C语言程序设计》第4版 何钦铭、颜晖主编 课后习题答案 第5章 习题5
- [elasticsearch笔记] Query DSL - percolate
- python调用API轻松实现AI 换脸
- linux 命令last -x,查询linux系统重启记录的last命令
- 高校逐梦元宇宙,是风口还是噱头?
- 后端技术精选 - 收藏集 - 掘金
- rsync+xinetd+inotify+sersync
- 简单温习一下快速排序
- 【网络通信 -- SIP 电话】项目实战记录 -- SIP 服务器 OPENSIPS 搭建测试与 SIP 客户端 PJSIP 编译安装测试