60. 排列序列

题目:

给出集合 [1,2,3,...,n],其所有元素共有 n! 种排列。

按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:

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

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

 

示例 1:

输入:n = 3, k = 3
输出:"213"

示例 2:

输入:n = 4, k = 9
输出:"2314"

示例 3:

输入:n = 3, k = 1
输出:"123"

代码1:

//超时

复制代码
 1 class Solution {  //典型的回溯法,只不过利用集合ArrayList
 2         static boolean b;        
 3     public String getPermutation(int n, int k) {
 4         ArrayList<String> al=new ArrayList<String>();
 5         StringBuilder sb=new StringBuilder();
 6         b=false;
 7         backTrack(1,n,k,sb,al);
 8         return al.get(k-1);
 9     }
10 
11     public static void backTrack(int t,int n,int k,StringBuilder sb,ArrayList<String> al){
12         if(b==true){return;}
13         if(t>n){
14             al.add(sb.toString());
15             if(al.size()==k){b=true;}           //找到第k个排列,剩余没必要再找了
16         }else{
17             for(int i=1;i<=n;++i){
18                 if(sb.indexOf(i+"")==-1){
19                     sb.append(i);
20                     backTrack(t+1,n,k,sb,al);
21                     sb.deleteCharAt(sb.length()-1);
22                 }
23             }
24         }
25     }
26     public static void swap(int[] arr,int i,int j){
27         int temp=arr[i];
28         arr[i]=arr[j];
29         arr[j]=temp;
30     }
31 }
复制代码

 代码2:

复制代码
 1 import java.lang.Character;
 2 class Solution {  //典型的回溯法,只不过利用集合ArrayList
 3         static int count;       
 4     public String getPermutation(int n, int k) {
 5         ArrayList<Character> arraylist=new  ArrayList<>();
 6         for(int i=1;i<=n;++i){  //只能处理小于10的数值
 7             arraylist.add((char)(i+'0'));
 8         }
 9         count=0;
10         backTrack(0,n,k,arraylist);
11         StringBuilder sb=new StringBuilder();
12         for(char ch:arraylist){
13                 sb.append(ch);
14         }
15         return sb.toString();
16     }
17 
18     public static void backTrack(int t,int n,int k,ArrayList arraylist){
19         if(count==k){return;}  //找到第k个排列,剩余没必要再找了
20         if(t>=n){
21             count++;           
22         }else{
23             for(int i=t;i<n;++i){
24 
25                 if(t==i){ 
26                     backTrack(t+1,n,k,arraylist); 
27                     if(count==k){return;} //剪枝函数
28                     continue;}
29                 char ch1=(char)arraylist.get(t);
30                 char ch2=(char)arraylist.get(i);
31                 arraylist.remove(i);
32                 arraylist.remove(t);
33                
34                 arraylist.add(t,ch2);
35                 arraylist.add(t+1,ch1);
36 
37                 backTrack(t+1,n,k,arraylist);
38                 if(count==k){return;}
39 
40                 arraylist.remove(t+1);
41                 arraylist.remove(t);
42                 
43                 arraylist.add(t,ch1);
44                 arraylist.add(i,ch2);
45 
46 
47                 }
48             }       
49     }
50 }
复制代码

 

posted @   堤苏白  阅读(108)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示