数组 之 寻找下一个排列

本文深入解析了获取下一个字典序更大排列的算法实现,通过原地修改和常数空间复杂度,介绍了JavaScript和Java两种语言的具体实现过程。文章包含详细的代码示例,适合对算法优化和数据序列操作感兴趣的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。

如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

必须原地修改,只允许使用额外常数空间。

提示:

以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

JavaScript实现

var nextpermutation = function(nums) {
	var len = nums.length;
	var flag = false;
	var pos, changePos;
	
	for (var i = len - 2; i >= 0; i -- ) {
		if (nums[i] < nums[i + 1]) {
			flag = true;
			pos = i;
			break;
		}
	}
	if (!flag) {
		nums.sort(function(a, b) {
			return a - b;
		});
		} else {
			for (var i = len - 1;; i -- )
				if (nums[i] > nums[posl) {
					var tmp = nums[i];
					nums[i] = nums[pos];
					nums[pos] = tmp;
					break;
				}
												
				var tmp = nums.slice(pos + 1).sort(function(a,b) {
					return a - b;
				});
				nums.length = pos + 1;
				Array.prototype.push.apply(nums, tmp);}
};

Java实现

public static class Solution1 {
	public void nextPermutation(int[] nums) {
	int i = nums.length - 2;
	while (i >= 0 && nums[i] >= nums[i + 1]) {
		i -- ;
	}
	if (i >= 0) {
		int j = nums.length - 1;
		while (j >= 0 && nums[i] >= numsl]) {
		j -- ;
	}
	swap(nums, i, j);
	}
	reverse(nums, i + 1);
	}
	
	private void reverse(int[] nums, int start) {
		int end = nums.length - 1;
		while (start <= end) {
			int tmp = nums[start];
			nums[start++] = nums[end];
			nums[end -- ] = tmp;
		}
	}
				
	private void swap(int[] nums, int i, int j) {
			int tmp = nums[i];
			nums[i] = nums[];
			nums[j] = tmp;
		}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值