力扣hot100题解(python版55-59题)

55、全排列

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

思路解答:

  1. 递归生成排列: 通过递归函数 backtrack,在每一步尝试将当前位置的元素与后续位置的元素交换,然后递归处理下一个位置。
  2. 交换元素: 在每一步尝试中,通过交换元素的位置来生成不同的排列,这样可以确保每个元素都出现在每个位置上。
  3. 回溯: 在递归调用完成后,需要恢复元素的原始顺序,以便进行下一次尝试。这样可以确保不会遗漏任何可能的排列。
  4. 终止条件: 当处理到列表的最后一个位置时(first == n-1),即已经生成了一个完整的排列,将该排列加入结果列表中。
def permute(nums: list[int]) -> list[list[int]]:def backtrack(first):if first == n-1:res.append(list(nums))returnfor i in range(first, n):nums[first], nums[i] = nums[i], nums[first]backtrack(first + 1)nums[first], nums[i] = nums[i], nums[first]n = len(nums)res = []backtrack(0)return res

56、子集

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

示例 1:

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

示例 2:

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

提示:

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

思路解答:

  1. 回溯生成子集: 使用回溯算法生成所有可能的子集。回溯算法的特点是尝试所有可能的选择,并在每一步都进行回溯,以便尝试其他选择。
  2. 递归生成子集: 定义了一个内部函数 backtrack(start, path),其中 start 表示当前处理的起始位置,path 表示当前的子集路径。
  3. 添加子集: 在每次递归调用开始时,将当前的 path 子集加入到结果列表 res 中,这样可以确保不漏掉任何子集。
  4. 遍历元素: 遍历从 startlen(nums) 的位置,将当前元素加入到 path 中,然后递归调用 backtrack(i + 1, path) 处理下一个位置。
  5. 回溯操作: 在递归调用完成后,需要将最后一个加入的元素从 path 中移除,以便尝试其他选择。
  6. 初始化及返回: 在函数主体中,初始化结果列表 res 为空列表,然后调用 backtrack(0, []) 开始生成子集。最后返回结果列表 res,其中包含了给定列表 nums 的所有子集。
def subsets(nums: list[int]) -> list[list[int]]:def backtrack(start, path):res.append(path[:])for i in range(start, len(nums)):path.append(nums[i])backtrack(i + 1, path)path.pop()res = []backtrack(0, [])return res

57、电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

img

示例 1:

输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

示例 2:

输入:digits = ""
输出:[]

示例 3:

输入:digits = "2"
输出:["a","b","c"]

提示:

  • 0 <= digits.length <= 4
  • digits[i] 是范围 ['2', '9'] 的一个数字。

思路解答:

  1. 递归实现:通过递归实现回溯算法,在每一步都遍历当前数字对应的所有字母,并递归调用下一层。
  2. 遍历元素: 遍历当前数字对应的字符位置,将当前元素加入到 path 中,然后递归调用 backtrack(index + 1, path) 处理下一个位置。
  3. 回溯操作: 在递归调用完成后,需要将最后一个加入的元素从 path 中移除,以便尝试其他选择。
  4. 终止条件:当遍历完所有字符时,将当前的字符组合加入结果集中。
def letterCombinations(digits: str) -> list[str]:if not digits:return []phone = {'2': ['a', 'b', 'c'],'3': ['d', 'e', 'f'],'4': ['g', 'h', 'i'],'5': ['j', 'k', 'l'],'6': ['m', 'n', 'o'],'7': ['p', 'q', 'r', 's'],'8': ['t', 'u', 'v'],'9': ['w', 'x', 'y', 'z']}def backtrack(index, path):if index == len(digits):res.append(''.join(path))returnfor char in phone[digits[index]]:path.append(char)backtrack(index + 1, path)path.pop()res = []backtrack(0, [])return res

58、组合总和

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。

candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。

对于给定的输入,保证和为 target 的不同组合数少于 150 个。

示例 1:

输入:candidates = [2,3,6,7], target = 7
输出:[[2,2,3],[7]]
解释:
2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。
7 也是一个候选, 7 = 7 。
仅有这两种组合。

示例 2:

输入: candidates = [2,3,5], target = 8
输出: [[2,2,2,2],[2,3,3],[3,5]]

示例 3:

输入: candidates = [2], target = 1
输出: []

提示:

  • 1 <= candidates.length <= 30
  • 2 <= candidates[i] <= 40
  • candidates 的所有元素 互不相同
  • 1 <= target <= 40

思路解答:

  1. 排序候选列表:首先对候选列表进行排序,这样可以在回溯的过程中更方便地控制搜索顺序。

  2. 回溯函数:编写一个回溯函数 backtrack(start, path, target),其中:

    • start:表示当前可以选择的候选元素的起始位置,避免重复组合;
    • path:记录当前的组合;
    • target:表示目标数值。
  3. 回溯过程

    • 如果 target == 0,将当前的组合加入结果集;
    • 如果 target < 0,直接返回,不再继续向下搜索;
    • 遍历候选列表中的元素:
      • 将当前元素加入组合 path 中;
      • 递归调用 backtrack,更新 targettarget - candidates[i],起始位置为 i
      • 在递归调用返回后,将当前元素从组合 path 中移除,继续下一个元素的搜索。
def combinationSum(candidates: list[int], target: int) -> list[list[int]]:def backtrack(start, path, target):if target == 0:res.append(path[:])returnif target < 0:returnfor i in range(start, len(candidates)):path.append(candidates[i])backtrack(i, path, target - candidates[i])path.pop()res = []candidates.sort()backtrack(0, [], target)return res

59、括号生成

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例 1:

输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]

示例 2:

输入:n = 1
输出:["()"]

提示:

  • 1 <= n <= 8

思路解答:

  1. 递归函数设计

    • 设计一个递归函数,函数参数包括左括号数量 left、右括号数量 right、当前组合 path
  2. 终止条件

    • 当当前组合长度达到 2 * n 时,将当前组合加入结果集。
  3. 递归过程

    • 在递归过程中,考虑两种情况:
      • 可以添加左括号的条件是 left < n
      • 可以添加右括号的条件是 right < left
  4. 回溯过程

    • 在回溯过程中,分别尝试添加左括号和右括号,并递归调用下一层。
def generateParenthesis(n: int) -> list[str]:def backtrack(left, right, path):if len(path) == 2 * n:res.append("".join(path))returnif left < n:path.append('(')backtrack(left + 1, right, path)path.pop()if right < left:path.append(')')backtrack(left, right + 1, path)path.pop()res = []backtrack(0, 0, [])return res

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/522410.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

植物病害识别:YOLO甘蔗叶片病害识别分类数据集

YOLO甘蔗叶片病害识别数据集, 包含尾孢菌叶斑病&#xff0c;眼斑病&#xff0c;健康&#xff0c;红腐病&#xff0c;锈病&#xff0c;黄叶病6个常见病类别&#xff0c;3300多张图像&#xff0c;yolo标注完整&#xff0c;全部原始图像&#xff0c;未应用增强。 适用于CV项目&…

VSCode国内镜像下载方法

VSCode国内镜像下载方法&#xff1a; 找到下载界面&#xff0c;点击下载后&#xff0c;发现下载速度非常慢。 复制下载链接&#xff0c;然后替换图中画线部分&#xff1a; 改为&#xff1a;vscode.cdn.azure.cn 然后将链接粘贴到浏览器回车&#xff0c;会发现嗖的一下就好了

LLM 构建Data Muti-Agents 赋能数据分析平台的实践之①:数据采集

一、 概述 在推进产业数字化的过程中&#xff0c;数据作为最重要的资源是优化产业管控过程和提升产业数字化水平的基础一环&#xff0c;如何实现数据采集工作的便利化、高效化、智能化是降低数据分析体系运转成本以及推动数据价值挖掘体系的基础手段。随着数字化在产业端的推进…

力扣hot100:240.搜索二维矩阵II(脑子)

吉大21级算法分析与设计的一道大题&#xff0c;由于每一行都是排好序的直接逐行二分 可以达到&#xff1a;O(mlogn)。但是这里追求更广的思路可以使用其他方法。 矩阵四分&#xff1a; 在矩阵中用中心点比较&#xff0c;如果target大于中心点的值&#xff0c;则由于升序排列&am…

中华环保联合会-- 工业废水处理设施等运维服务认证介绍

为适应市场发展需要,规范环境服务业市场&#xff0c;中华环保联合会[中环联兴(北京)认证中心]于2023年8月经国家认证认可监督管理委员会正式批准增加“工业废水处理、城镇污水处理、农村污水处理设施运维服务认证”等认证领域&#xff0c;并完善环保领域服务认证体系。 一、认…

OpenHarmony教程指南-自定义通知推送

介绍 本示例主要展示了通知过滤回调管理的功能&#xff0c;使用ohos.notificationManager 接口&#xff0c;进行通知监听回调&#xff0c;决定应用通知是否发送。 效果预览 使用说明 1.在使用本应用时&#xff0c;需安装自定义通知角标应用&#xff1b; 2.在主界面&#xff…

influxdb2.0插入数据字段类型出现冲突问题解决

一、问题出现 一个学校换热站自控系统&#xff0c;会定时从换热站获取测点数据&#xff0c;并插入到influxdb数据库中。influxdb插入数据时&#xff0c;报错提示&#xff1a; com.influxdb.exceptions.UnprocessableEntityException: failure writing points to database: par…

安卓类加载机制

目录 一、ClassLoader介绍二、双亲委托机制三、类的加载过程 一、ClassLoader介绍 任何一个 Java 程序都是由一个或多个 class 文件组成&#xff0c;在程序运行时&#xff0c;需要将 class 文件加载到 JVM 中才可以使用&#xff0c;负责加载这些 class 文件的就是 Java 的类加…

Caused by: java.lang.NoSuchFieldError 问题解决方案

原因分析 最近改了下依赖包版本&#xff0c;编译启动没啥问题&#xff0c;但调接口的时候报错了 遇到这种问题一般都是依赖包版本冲突造成的 找到冲突的包 想要解决依赖包的版本冲突&#xff0c;首先要找到是哪个包出了问题 我们来看报错的地方是AlgorithmUtil这个类&…

Vue3:OptionsAPI 与 CompositionAPI的比较

1、Vue2 Vue2的API设计是Options&#xff08;配置&#xff09;风格的。 Options API 的弊端 Options类型的 API&#xff0c;数据、方法、计算属性等&#xff0c;是分散在&#xff1a;data、methods、computed中的&#xff0c;若想新增或者修改一个需求&#xff0c;就需要分别…

正则表达式 || 遇到字符串里面有() 就在括号后面换行

<template><div class"vertical-layout"><header><h1>testPage</h1><p>(1)第一行内容xxxxxxxxx&#xff08;2&#xff09;第二行内容xxxxxxx(3)第三行内容</p></header><main><el-button click"goToO…

第三百八十九回

文章目录 1. 概念介绍2. 使用方法2.1 获取所有时区2.2 转换时区时间 3. 示例代码4. 内容总结 我们在上一章回中介绍了"分享一些好的Flutter站点"相关的内容&#xff0c;本章回中将介绍timezone包.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在…