Permutation Sequence

本文介绍了一种算法,用于找出由1到n组成的全排列中的第k个排列序列。提供了两种解决方案:一种基于下一个排列的计算,另一种通过确定每个位置上的数字来构造答案。

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

The set [1,2,3,…,n] contains a total of n! unique permutations.

By listing and labeling all of the permutations in order,
We get the following sequence (ie, for n = 3):

  1. "123"
  2. "132"
  3. "213"
  4. "231"
  5. "312"
  6. "321"

Given n and k, return the kth permutation sequence.

Note: Given n will be between 1 and 9 inclusive.

1. Based on nextPermutation

public class Solution {
    public String getPermutation(int n, int k) {
		// Start typing your Java solution below
		// DO NOT write main() function
		int[] num = new int[n];
		for(int i = 0; i < n; i++){
			num[i] = i + 1;
		}
		for(int i = 1; i < k; i++){
			num = nextPermutation(num);
		}
		StringBuilder sb = new StringBuilder();
		for(int i = 0; i < n; i++)
			sb.append(num[i]);
		return sb.toString();
	}

	public int[] nextPermutation(int[] num) {
		// Start typing your Java solution below
		// DO NOT write main() function
		int len = num.length;
		if (len <= 1)
			return null;
		for (int i = len - 1; i > 0; i--) {
			// 找到第一个下降的元素
			if (num[i - 1] < num[i]) {
				// 找到被交换的那个数, min value in num[i...len - 1] that > num[i - 1]
				int j = i;
				while (j < len && num[j] > num[i - 1])
					j++;
				j--;
				int tmp = num[j];
				num[j] = num[i - 1];
				num[i - 1] = tmp;
				Arrays.sort(num, i, len);
				return num;
			}
		}
		Arrays.sort(num);
		return num;
	}
}

2. 找到k的位置,以确定最左端数字。

public class Solution {
    public String getPermutation(int n, int k) {
		// Start typing your Java solution below
		// DO NOT write main() function
		if (n == 0 || k == 0)
			return "";
		int[] cnt = new int[n + 1];
		cnt[0] = 1;
		for (int i = 1; i <= n; i++) {
			cnt[i] = cnt[i - 1] * i;
		}
		if (k > cnt[n])// cnt[n] means total number of permutations
			return null;
		int[] nums = new int[n];
		for (int i = 0; i < n; i++)
			nums[i] = i + 1;
		return getPermutations(nums, cnt, n, k);
	}

	public String getPermutations(int[] nums, int[] cnt, int n, int k) {
		if (n == 0)
			return "";
		for (int i = 1; i <= n; i++) {
			if (k <= cnt[n - 1] * i) {
				int t = nums[i - 1];
				for (int j = i - 1; j < n - 1; j++) {
					nums[j] = nums[j + 1];
				}
				return Integer.toString(t)
						+ getPermutations(nums, cnt, n - 1, k - cnt[n - 1] * (i - 1));
			}
		}
		return "";
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值