LeetCode - permutation-sequence

题目:

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 k th permutation sequence.

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

 

题意:

集合[1,2,3,…,n]总共包含n!独特的排列。

通过列出并标记所有排列的顺序,

我们得到如下序列(即n = 3时):

“123”

“132”

“213”

“231”

“312”

“321”

给定n和k,返回第k个排列序列。

注:给定n包括1和9在内。

 

解题思路:

1.回溯法

用数组num[i]记录 1-n的数字,在回溯的过程中,当 count  == k 返回res。详细可以看代码注释

	//返回结果
	String res = "";
	//统计组合数
	int count = 0;
	public String getPermutation(int n, int k) {
		
		int[] num = new int[n];
		
		for(int i = 1;i <= n;i++ ) {
			num[i-1] = i;
		}
		
		helper(num,k,n,"");
		return res;
	}
	
	void helper(int[] num ,int k, int n, String str) {
		//一个组合完毕
		if(n == 0) {
			count++;
			//覆盖之前的组合
			res = "" + str;
			return;
		}
		
		for(int i = 0; i < num.length;i++) {
			//当数字为0时,跳过这次循环
			if(num[i] == 0) {
				continue;
			}
			
			str += num[i];
			//当前数字在这次组合中已经被用过,做个标识置0
			num[i] = 0;
			
			helper(num,k,n-1,str);
			
			if(count == k) {
				break;
			}
			
			//重新恢复使用
			num[i] = i+1;
			
			//后退,删除最后一个字符
			str = str.substring(0, str.length() - 1);
			
		}
	}

 

2.通过找规律来解决

Permutation Sequence

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值