【算法三十一】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)

相关推荐
小雅痞14 小时前
[Java][Leetcode hard] 42. 接雨水
java·开发语言·leetcode
载数而行52014 小时前
算法集训1:模拟,枚举,错误分析,前缀和,差分
算法
hehelm14 小时前
vector模拟实现
前端·javascript·算法
Tina学编程15 小时前
[HOT 100]今日一练------划分字母区间
算法·hot 100
RTC老炮15 小时前
RaptorQ前向纠错算法架构分析
网络·算法·架构·webrtc
故事和你9115 小时前
洛谷-数据结构1-1-线性表2
开发语言·数据结构·算法·动态规划·图论
小徐不徐说15 小时前
面试C++易错点总结
开发语言·c++·面试·职场和发展·程序设计·工作
m0_5557629015 小时前
从原始信号到IQ图的数学公式推导
算法
靠沿15 小时前
【递归、搜索与回溯算法】专题四——综合练习
算法·深度优先
北顾笙98016 小时前
day26-数据结构力扣
数据结构·算法·leetcode