IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> java自制全排列工具类(AllSort) -> 正文阅读

[数据结构与算法]java自制全排列工具类(AllSort)

前言

前面玩了一下,发现有个需求想要使用那个全排列,然后发现这java里面好像是没有这个玩意的,所以我就想封装一下,然后做个工具类玩玩。这个工具类的原理是使用DFS进行深度搜索做的。

原理

这个原理很简单,我就随便说一下吧。

image.png

把这个画出来基本上,回溯就相当于写完了。

代码


class AllSort<E>{
    
    private ArrayList<E> list;

    public AllSort(ArrayList<E> list) {
        this.list = list;
    }

    public ArrayList<ArrayList<E>> Allsort() {
        boolean[] used = new boolean[list.size()];
        ArrayList<ArrayList<E>> AllsortAns = new ArrayList<>();
        backtrack(list,new ArrayList<>(),used,AllsortAns);

        return AllsortAns;
    }
    private void backtrack(ArrayList<E> nums, ArrayList<E> curr, boolean[] used, ArrayList<ArrayList<E>> AllsortAns ){
        if(curr.size() == nums.size()){
  //如果有特殊需要,比如需要处理每一次排列好的值,那么可以在这里处理,curr是个ArrayList
            AllsortAns.add(new ArrayList<E>(curr));

            return;
        }
        for (int i = 0; i < nums.size(); i++) {
            if(used[i]) continue;
            curr.add(nums.get(i));
            used[i] = true;
            backtrack(nums,curr,used,AllsortAns);
            curr.remove(curr.size()-1);
            used[i] = false;
        }
    }
}

这里做了一个小优化,就是使用那个used数组来查看那个用木有被用到,这样查找有木有重复的时间复杂度就降低了。
然后这里也是支持泛型,所以这里传递的数组必须是包装类,这个就是我觉得不太好的地方,但是谁让他降低了我的代码复用呢。

调用

调用就简单了,直接调用Allsort() 方法

lass TestAll{
    public static void main(String[] args) {
        String need = "abc";
        Character[] characters = need.chars().mapToObj(c -> (char) c).toArray(Character[]::new);//转化为Character[]
        AllSort<Character> integerAllSort = new AllSort<>(new ArrayList<Character>(Arrays.asList(characters)));
        ArrayList<ArrayList<Character>> allsort = integerAllSort.Allsort();
        for (int i = 0; i < allsort.size(); i++) {
            System.out.println(allsort.get(i));
        }
    }
}

image.png

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:55:08  更:2022-02-26 11:55:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 17:00:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码