解题思路:

注意事项:

参考代码:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Main {
   public static void main(String[] args) {
       Scanner sc = new Scanner(System.in);
       List<List<Integer>> ans = new ArrayList<>();
       int n=sc.nextInt();
       //创建数组
       int[] arr = new int[n];
       //填充数组
       for (int i = 0; i < n; i++) {
           arr[i]=i+1;
       }
       //开始dfs
       f(arr,0,ans);
       //集合通过lambda表达式来进行按照字典序排序
       Collections.sort(ans, (o1, o2) -> {
           int minLength = Math.min(o1.size(), o2.size());
           for (int i = 0; i < minLength; i++) {
               if (!o1.get(i).equals(o2.get(i))) {
                   return o1.get(i).compareTo(o2.get(i));
               }
           }
           return Integer.compare(o1.size(), o2.size()); // 如果前minLength项相同,按长度比较
       });
       //循环遍历输出
       for (List<Integer> an : ans) {
           for (Integer i : an) {
               System.out.print(i+" ");
           }
           System.out.println();
       }
   }
   //数组 1 2 3 4 5
   //下标 0 1 2 3 4
   //逻辑让0位置和0 1 2 3 4 都交换一边,然后调用1位置与 剩下的交换,一直递归,知道最后然后添加到集合中,然后再回溯回来
   public static void f(int[] nums, int i, List<List<Integer>> ans) {
       if (i == nums.length) {
           List<Integer> cur = new ArrayList<>();
           for (int num : nums) {
               cur.add(num);
           }
           ans.add(cur);
       } else {
           for (int j = i; j < nums.length; j++) {
               swap(nums, i, j);
               f(nums, i + 1, ans);
               swap(nums, i, j);
           }
       }
   }


   public static void swap(int[] arr,int a,int b){
       int temp=arr[a];
       arr[a]=arr[b];
       arr[b]=temp;
   }
}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论