60. 排列序列
题目:
给出集合 [1,2,3,...,n]
,其所有元素共有 n!
种排列。
按大小顺序列出所有排列情况,并一一标记,当 n = 3
时, 所有排列如下:
"123"
"132"
"213"
"231"
"312"
"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 }
· 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应用必不可少的技术