【算法三十一】46. 全排列

46. 全排列

回溯:

java 复制代码
class Solution {
    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> ans = new ArrayList<>();
        List<Integer> path = new ArrayList<>();
        boolean[] used = new boolean[nums.length];
        backtrack(nums,ans,path,used);
        return ans;
    }

    private void backtrack(int[] nums,List<List<Integer>> ans,List<Integer> path,boolean[] used){
        //确保往下搜索完
        if(path.size() == nums.length){
            ans.add(new ArrayList<>(path));
            return;
        }

        //确保第一个数遍历完,1 2 3....
        for(int i = 0;i<nums.length;i++){
            //没选的进来
            if(!used[i]){
                path.add(nums[i]);
                used[i] = true;

            //确保选完
            backtrack(nums,ans,path,used);

            //回溯删除
            used[i] = false;
            path.remove(path.size()-1);
            }
        }
    }
}

时间复杂度:O(N*N!)

java 复制代码
public ArrayList(Collection<? extends E> c) {
    // 1. 把原集合变成数组
    Object[] a = c.toArray(); 
    // 2. 这里的 Arrays.copyOf 内部就是一个 for 循环
    // 它会把 a 数组里的每一个元素,一个一个复制到新创建的 ArrayList 内部数组里
    this.elementData = Arrays.copyOf(a, a.length, Object[].class);
}

每一个new ArrayList需要遍历N次,一共需要N!,所有总时间复杂度为N*N!

空间复杂度:O(N)

相关推荐
程序 代码狂人1 天前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
HDU-Dade1 天前
【校招笔试真题】简要介绍 Self-Attention 的前沿算法
人工智能·算法
Xin7701 天前
LeetCode 79. 单词搜索(DFS 回溯法)
leetcode
小郎君6581 天前
Vue keep-alive 切标签后滚动位置回顶?因为 onDeactivated 里读到的 scrollTop 是 0
算法
邵奈一1 天前
GPT-6.1 Terra速度是Sol的3倍,价格减半
算法
RaaS1001 天前
Node.js Brotli RCE 漏洞自查指南:fetch、undici、axios 都在影响面,三分钟确认你的版本
人工智能·深度学习·算法
shehuiyuelaiyuehao1 天前
算法56,重排链表
数据结构·算法·链表
qq_452396231 天前
第四篇:《索引原理与实战:B-tree、Hash、GIN、GiST、BRIN》
算法·哈希算法·gin
西索斯coding1 天前
Qwen3-Max 与 Qwen-Plus:60 个真实修复任务评测方案
大数据·网络·算法·ai