回溯法、另辟蹊径法 求数组的全排序

简介: 回溯法、另辟蹊径法 求数组的全排序

一、回溯法【路径,选择条件,结束条件】


回溯法,其实也是决策树,核心代码,就是for循环里面的递归,在递归调用之前【做出选择】,递归调用之后【撤销选择】

# 核心代码
result = []
def backtrack(路径,选择列表):
  if 满足条件:
    result.add(路径)
    return
  for 选择 in 选择列表:
    做选择
    backtrack(路径,选择列表)
    撤销选择

完整代码:


public class Permute {
    List<List<Integer>> res = new ArrayList<List<Integer>>();
    public List<List<Integer>> permute(int[] nums) {
        if (nums == null || nums.length ==0) return res;
        helper(nums,new ArrayList<Integer>());
        return res;
    }
    private void helper(int[] nums, ArrayList<Integer> tmp) {
        if (tmp.size() == nums.length){
            res.add(new ArrayList<>(tmp));
            return;
        }
        for (int i = 0; i < nums.length; i++) {
            if (tmp.contains(nums[i])) continue;
            tmp.add(nums[i]);
            helper(nums,tmp);
            tmp.remove(tmp.size()-1);
        }
    }
}


二、另辟蹊径新方法【搞怪的方法,很简单实用】


有时候,我觉得暴力一点也很好,但是我看到很多暴力的代码,需要比较交换很多次,严重的影响的代码的阅读,我想出了一个直接利用最大值循环,并利用Collections.shuffle的方法,因为最后的全排序的值时固定的,利用一个set集合,当达到了这个之后,直接退出循环就好。

你想到这个思想的小问题在哪里吗?

问题:只能计算输出没有重复元素的数组


public static void permute2(int[] nums) {
        if (nums == null || nums.length == 0) {
            //return new ArrayList<>();
        }
        // 共有多少种情况
        int sum = 1;
        for (int i = nums.length; i>0; i--) {
            sum = sum * i;
        }
        System.out.println(sum);
        ArrayList<Integer> list = new ArrayList<>();
        for (int num : nums) {
            list.add(num);
        }
        Set<List<Integer>> set = new HashSet<>();
        for (int i = 0; i < 3000000; i++) {
            Collections.shuffle(list);
            ArrayList<Integer> templist = new ArrayList<>(list);
            set.add(templist);
      // set集合的大小 = 指定的数量  退出循环
            if (set.size() == sum){
                break;
            }
            System.out.println(i);
        }
        System.out.println(set);
    }

执行结果:最终执行了10次就退出循环了 【每次执行总次数不一样】


5ecc1f6321bb47059f5a385e68aa3e60.png

677efbc895fd48a3943dd5c2eb71b13f.png

目录
相关文章
|
自然语言处理 监控 项目管理
PMP备考之路 - 汪博士第五章(项目范围管理)(上)
PMP备考之路 - 汪博士第五章(项目范围管理)
217 0
移动端touch拖动事件和click事件冲突问题解决
移动端touch拖动事件和click事件冲突问题解决
426 0
[蓝桥杯 2022 省 B] 修建灌木
[蓝桥杯 2022 省 B] 修建灌木
199 0
|
消息中间件 存储 网络协议
多类型业务消息专题-事务消息 | 学习笔记
快速学习多类型业务消息专题-事务消息
220 0
多类型业务消息专题-事务消息 | 学习笔记
|
存储 运维 数据中心
《VMware vSphere 6.0虚拟化架构实战指南》——第2章 安装配置VMware ESXi 6.0 2.1VMware vSphere 6.0虚拟化介绍
VMware vSphere Virtual Volumes使外部存储阵列能够识别虚拟机。基于存储策略的管理(SPBM)可允许跨存储层实现通用管理,以及动态存储类服务自动化。它们相互配合,可以真正实现按虚拟机更加高效地实例化数据服务(快照、克隆、远程复制、重复数据消除等)的精确组合。
4207 0
|
安全
ElasticSearch远程任意代码执行漏洞(CVE-2014-3120)分析
原理 这个漏洞实际上非常简单,ElasticSearch有脚本执行(scripting)的功能,可以很方便地对查询出来的数据再加工处理。
2015 0
|
5天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
15天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~