算法每日一练 (11)

news/2025/3/16 15:06:40/

💢欢迎来到张胤尘的技术站
💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥

文章目录

  • 算法每日一练 (11)
    • 全排列
      • 题目描述
      • 解题思路
      • 解题代码
        • `c/c++`
        • `golang`
        • `lua`

官方站点: 力扣 Leetcode

算法每日一练 (11)

全排列

题目地址:全排列

题目描述

给定一个不含重复数字的数组 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 中的所有整数 互不相同

解题思路

  • 整体解题流程采用回溯的思路。
  • 首先递归终止条件,如果当前状态已经满足了子集的条件,则返回到上一层。在本题中,递归终止条件就是当前索引到达了数组末尾,则无需向下继续递归。
  • 紧接着就是在递归的过程中,枚举所有可能的选择,并针对每种情况都进行处理。
  • 从当前索引开始,尝试交换每个位置的元素,然后递归的调用 backtrack 方法处理每一种情况。
  • 紧接着回溯是关键步骤,在每次递归返回后,需要撤销当前的选择,恢复到上一步的状态,以便尝试其他可能性。
  • 最后当所有的排列全部列举完毕后,返回 result 结果集即可。

解题代码

c/c++
#include <vector>class Solution
{
public:std::vector<std::vector<int>> permute(std::vector<int> &nums){std::vector<std::vector<int>> result;std::vector<int> current = nums;backtrack(result, current, 0);return result;}private:void backtrack(std::vector<std::vector<int>> &result, std::vector<int> &current, int start){if (start == current.size()){result.push_back(current);return;}for (int i = start; i < current.size(); ++i){std::swap(current[start], current[i]);backtrack(result, current, start + 1);std::swap(current[start], current[i]);}}
};
golang
func permute(nums []int) [][]int {result := [][]int{}backtrack(&result, &nums, 0)return result
}func backtrack(result *[][]int, current *[]int, start int) {sz := len(*current)if start == sz {perm := make([]int, sz)copy(perm, *current)*result = append(*result, perm)return}for i := start; i < sz; i++ {(*current)[i], (*current)[start] = (*current)[start], (*current)[i]backtrack(result, current, start+1)(*current)[i], (*current)[start] = (*current)[start], (*current)[i]}return
}
lua
local function copyTable(t)local copy = {}for i = 1, #t docopy[i] = t[i]endreturn copy
endlocal function backtrack(result, current, start)local sz = #currentif sz == start thentable.insert(result, copyTable(current))returnendfor i = start, sz docurrent[i], current[start] = current[start], current[i]backtrack(result, current, start + 1)current[i], current[start] = current[start], current[i]end
endlocal function permute(nums)local result = {}backtrack(result, nums, 1)return result
end

🌺🌺🌺撒花!

如果本文对你有帮助,就点关注或者留个👍
如果您有任何技术问题或者需要更多其他的内容,请随时向我提问。

在这里插入图片描述


http://www.ppmy.cn/news/1579590.html

相关文章

Java数据结构第二十三期:Map与Set的高效应用之道(二)

专栏&#xff1a;Java数据结构秘籍 个人主页&#xff1a;手握风云 目录 一、哈希表 1.1. 概念 1.2. 冲突 1.3. 避免冲突 1.4. 解决冲突 1.5. 实现 二、OJ练习 2.1. 只出现一次的数字 2.2. 随机链表的复制 2.3. 宝石与石头 一、哈希表 1.1. 概念 顺序结构以及平衡树中…

Node.js REPL 深入解析

Node.js REPL 深入解析 引言 Node.js 作为一种流行的 JavaScript 运行环境,在服务器端开发中扮演着重要角色。REPL(Read-Eval-Print Loop,读取-求值-打印循环)是 Node.js 的一个核心特性,它允许开发者在一个交互式环境中执行 JavaScript 代码。本文将深入探讨 Node.js R…

计算机网络——DNS

一、什么是DNS&#xff1f; DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09; 是互联网的核心服务&#xff0c;负责将人类可读的域名&#xff08;如 www.baidu.com&#xff09;转换为机器可识别的 IP地址&#xff08;如 14.119.104.254&#xff09;。它像一…

专访数势科技谭李:智能分析 Agent 打通数据平权的最后一公里

作者|斗斗 编辑|皮爷 出品|产业家 伦敦塔桥下的泰晤士河底&#xff0c;埋藏着工业革命的隐秘图腾——布鲁内尔设计的隧道盾构机。在19世纪城市地下轨道建设的过程中&#xff0c;这个直径11米的钢铁巨兽没有选择拓宽河道&#xff0c;而是开创了地下通行的新维度。 “我们不…

CTA重建:脑血管重建,CT三维重建,三维建模 技术,实现

CTA&#xff08;CT血管造影&#xff09;是一种基于CT扫描的医学成像技术&#xff0c;主要用于血管系统的三维重建和可视化。脑血管重建是CTA的重要应用之一&#xff0c;能够帮助医生诊断脑血管疾病&#xff08;如动脉瘤、狭窄、畸形等&#xff09;。以下是实现CTA脑血管重建、C…

STM32 内置的通讯协议

数据是以帧为单位发的 USART和UART的区别就是有没有同步功能 同步是两端设备有时钟连接&#xff0c;异步是没时钟连接&#xff0c;靠约定号的频率&#xff08;波特率&#xff09;接收发送数据 RTS和CTS是用来给外界发送已“可接收”或“可发送”信号的&#xff0c;一般用不到…

【PyCharm2024】一些好用的小功能

目录 一、全局查找及替换关键字 方法一&#xff1a; 方法二&#xff1a; 二、调整字体大小 三、调整Terminal的字体大小 四、改变行注释的斜体以及颜色 一、全局查找及替换关键字 编写程序时&#xff0c;通常想要在所有文件中查找或者替换某个词。 方法一&#xff1a; …

ChromeOS 133 版本更新

ChromeOS 133 版本更新 1. 增强托管用户的 Office 文件处理功能 从 ChromeOS 133 开始&#xff0c;托管用户 现在可以 无缝打开和编辑 Microsoft Office 文件&#xff08;Word、PowerPoint、Excel&#xff09;&#xff0c;无论他们使用的是 Microsoft 365&#xff08;Office …