LeetCode刷题篇——下一个排列

该文章描述了一种算法,用于找到一个整数数组的下一个字典序更大的排列。通过从右向左遍历,找到第一个比后一位小的数字的索引,然后找到大于该数字的右侧最小数字进行交换,并反转相应子数组来实现。如果数组完全降序,则直接反转整个数组。
摘要由CSDN通过智能技术生成

下一个排列

题目

整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。
链接

思路

从右往左遍历数组,找到当前位比后一位小的第一个位置,记为left,若left为初始值,则说明数组完全降序,直接将数组整体反转;否则再从右往左遍历,找到比nums[left]大的第一个数,将它与nums[left]交换后,将left+1到末尾这一部分数组全部反转,即为下一个排列

class solution {
	public void nextPermutation(int[] nums) {
		int len = nums.length;
		int left = -1;
		// left为比后一位更小的数的索引
		for (int i = len - 2; i >= 0; i--) {
			if (nums[i] < nums[i + 1]) {
				left = i;
				break;
			}
		}

		if (left == -1) {
			reverse(nums, 0, len - 1);
		} else {
			int right = -1;
      		// right为从右往左比nums[left]大的第一个数的索引
			for (int j = len - 1; j > left; j--) {
				if (nums[j] > nums[left]) {
					right = j;
					break;
				}
			}
			int tmp = nums[left];
			nums[left] = nums[right];
			nums[right] = tmp;
			reverse(nums, left + 1, len - 1);
		}
	}

  	// 将数组在L~R范围内反转
	public void reverse(int[] nums, int L, int R) {
		while (L < R) {
			int tmp = nums[L];
			nums[L] = nums[R];
			nums[R] = tmp;
			L++;
			R--;
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值