当前位置: 首页 > article >正文

【数据结构与算法】力扣 46. 全排列

回溯算法

一般回溯的逻辑放在递归函数的下面。这是一种效率低纯暴力的解法,且没有其它的更好的解法。

其核心思想是尝试构建一个解的过程,逐步推进,并在发现当前部分解无法生成一个完整解时,进行回溯,即撤销最近的选择,然后尝试其他可能的选择。

常见场景:

  • 排列问题(有序)
  • 组合问题(无序)
  • 切割问题(比如切割字符串)
  • 子集问题
  • 棋盘问题(N皇后、解数独)

模板伪代码:

function backtrack(解的当前状态):
    if 当前状态是一个解:
        保存解
        return
    
    for 所有可能的选择 in 当前状态的选项集合:
        做选择
        backtrack(更新后的状态)
        撤销选择

题目描述

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例 1:

输入: nums = [1,2,3]
输出: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

示例 2:

输入: nums = [0,1]
输出: [[0,1],[1,0]]

示例 3:

输入: nums = [1]
输出: [[1]]

提示:

  • 1 <= nums.length <= 6
  • -10 <= nums[i] <= 10
  • nums 中的所有整数 互不相同

分析解答

很明显这是一道排列问题,遇到排列问题,最先想到的应该就是回溯算法。

参数说明:

  • path:每次遍历的一个结果集
  • used:对元素做标记,避免重复使用
/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var permute = function(nums) {
    const results = []; // 存储最终的全排列结果

    function backtrack(path, used) {
        // 如果当前路径长度等于输入数组长度,说明已经形成了一个完整的排列
        if (path.length === nums.length) {
            results.push([...path]); // 将当前排列添加到结果中
            return;
        }

        // 遍历每个数字 排列和顺序有关 所以总是从 0 开始
        for (let i = 0; i < nums.length; i++) {
            // 如果当前数字已经被使用过,则跳过
            if (used[i]) continue;

            // 选择当前数字
            path.push(nums[i]);
            used[i] = true;

            // 递归调用,继续选择下一个数字
            backtrack(path, used);

            // 撤销选择(回溯),准备尝试下一个可能的数字
            path.pop();
            used[i] = false;
        }
    }

    // 初始化递归调用
    backtrack([], Array(nums.length).fill(false));
    return results;
};

思路拓展


http://www.kler.cn/news/364565.html

相关文章:

  • 【Conda】Conda 超时设置及优化指南:提升包管理效率的关键
  • 小程序如何根据用户的不同显示不同导航栏
  • Android组件化开发
  • ESP32移植Openharmony外设篇(3)OLED屏
  • 工作使用的工具
  • win10中mysql数据库binlog恢复
  • 中国人寿财险青岛市分公司引领科技金融新风尚
  • HarmonyOS 5.0应用开发——应用打包HAP、HAR、HSP
  • 新160个crackme - 082-phox.1
  • Elasticsearch在分布式集群中进行数据分片的策略能否完全避免数据热点?数据分片分布不均会导致性能瓶颈吗?如何通过实践优化分片分布?
  • 本地生活平台开发搭建方案 同城O2O电商平台推广运营
  • OpenCV视觉分析之运动分析(2)背景减除类:BackgroundSubtractorKNN的使用
  • 缓存雪崩是什么
  • SparseRCNN 模型,用于目标检测任务
  • 云计算行业应用实训室建设方案
  • es 常用命令(已亲测)
  • Unity编辑器 连接不到SteamVR问题记录
  • 一个批量输出PDF页数的python程序
  • 常用MQ组件选型时需要考虑的问题
  • 独家大模型经典面试秘籍:问题答案超详细,收藏此文就够咯
  • AnaTraf | 探讨TCP握手时延
  • JavaScript正则表达式利器:exec()方法深度解析与应用实例
  • pnpm : 无法加载文件...
  • 用户画像中不同机器学习模型的优缺点和适用场景
  • Apache Flink 2.0-preview released
  • 如何在Debian操作系统上安装Docker