news 2026/6/15 21:09:45

Hot100——回溯

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Hot100——回溯

全排列

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

dfs回溯

注意:res在添加的时候是res.append(path[:]),res.append(path)这个是传递本质上是复制了path的地址,但是每次dfs结束后path会变为空的,所以直接那么写最后会返回空列表。所以写成res.append(path[:]) 做一次浅拷贝即可。(或者写成res.append(path.copy())

class Solution: def permute(self, nums: List[int]) -> List[List[int]]: def dfs(nums, size, depth, path, flag, res): if depth == size: res.append(path[:]) return for i in range(size): if not flag[i]: path.append(nums[i]) flag[i] = True dfs(nums, size, depth + 1, path, flag, res) flag[i] = False path.pop() size = len(nums) if size == 0: return [] res = [] flag = [False for _ in range(size)] dfs(nums, size, 0, [], flag, res) return res

dfs回溯优化—去掉标记数组

用一个first来维护已选数字和未选数字。

官方思路:

class Solution: def permute(self, nums: List[int]) -> List[List[int]]: result = [] path=list() def dfs(first:int): if first==len(nums): result.append(path.copy()) return for i in range(first,len(nums)): path.append(nums[i]) nums[first] ,nums[i]= nums[i],nums[first] dfs(first+1) path.pop() nums[first] ,nums[i]= nums[i],nums[first] dfs(0) return result

子集

给你一个整数数组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中的所有元素互不相同

python自带函数库

itertools.combinations(iterable, r)这个就是生成组合数的库,iterable是迭代对象,r是从迭代对象中选出r个数进行组合。(组合的特点:

  • 组合是无序的:选取的元素顺序和原可迭代对象中一致,且不重复选取同一元素不考虑排列顺序(比如从[1,2]中取 2 个元素,只会生成(1,2),不会再生成(2,1));
  • 无重复组合:每个组合中的元素都是唯一的(基于原可迭代对象的元素位置,而非值,若原对象有重复值,会生成重复组合,但本题中nums是无重复元素的)

itertools.permutations(iterable, r):生成的是排列,考虑顺序(比如从[1,2]取 2 个元素,会生成(1,2)(2,1)

class Solution: def subsets(self, nums: List[int]) -> List[List[int]]: res = [] for i in range(len(nums) + 1): tmp = itertools.combinations(nums, i) #tmp是元组 res = res + list(tmp) #tmp转换为列表 return res

迭代

class Solution: def subsets(self, nums: List[int]) -> List[List[int]]: res = [[]] for i in nums: res = res + [[i] + num for num in res] return res

递归

class Solution: def subsets(self, nums: List[int]) -> List[List[int]]: res = [] n = len(nums) def dfs(i, tmp): res.append(tmp) for j in range(i, n): dfs(j + 1, tmp + [nums[j]]) dfs(0, []) return res

电话号码的字母组合

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

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

示例 1:

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

示例 2:

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

提示:

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

回溯

class Solution: def letterCombinations(self, digits: str) -> List[str]: if not digits: return [] phoneMap = { "2": "abc", "3": "def", "4": "ghi", "5": "jkl", "6": "mno", "7": "pqrs", "8": "tuv", "9": "wxyz", } combination = list() combinations = list() def dfs(index: int): if index == len(digits): combinations.append("".join(combination)) else: digit = digits[index] for letter in phoneMap[digit]: combination.append(letter) dfs(index+1) combination.pop() dfs(0) return combinations
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 14:59:51

TikTok推荐算法怎么快速涨粉

在TikTok这个充满创意和活力的平台上&#xff0c;想要快速增加粉丝&#xff0c;就需要深入了解并巧妙利用其推荐算法。以下是一些实用的策略&#xff0c;帮助你在TikTok上迅速提升粉丝数量&#xff0c;提高视频的曝光率。 1. 内容质量与原创性 内容为王&#xff0c;在TikTok上尤…

作者头像 李华
网站建设 2026/6/15 14:58:38

重磅发布永磁同步电机径向电磁力密度matlab二维傅立叶变换程序FFT2D。 图1为我写的图2...

重磅发布永磁同步电机径向电磁力密度matlab二维傅立叶变换程序FFT2D。 图1为我写的图2为Maxwell 自带的UDF 求解结果&#xff0c;表格数据在第二张图。这玩意儿搞电机电磁力分析的老铁肯定懂——二维傅里叶变换简直就是从时/空域杀进频域的屠龙刀。今天给大伙儿整点硬货&#x…

作者头像 李华
网站建设 2026/6/15 13:33:08

手把手玩转Prescan超车换道:当15m/s遇上龟速障碍车

prescan simulink 车辆超车换道&#xff0c;主车速度15m/s&#xff0c;一个运动障碍车速度5m/s&#xff0c;一个固定障碍车&#xff0c;超车加油门后回到原车道高速上遇到前方慢车&#xff0c;一把方向变道超车是驾驶员的基操。今天咱们用PrescanSimulink复现这个场景——主车1…

作者头像 李华
网站建设 2026/6/15 13:32:42

ERP与OA系统集成服务:如何选择适合企业的“业务自动化伙伴”

引言在企业迈向数字化转型与精细化管理的进程中&#xff0c;业务自动化已成为提升核心竞争力的关键一环。特别是在流程繁多、协作需求旺盛的制造业&#xff0c;ERP&#xff08;企业资源计划&#xff09;与OA&#xff08;办公自动化&#xff09;两大核心系统的深度融合&#xff…

作者头像 李华
网站建设 2026/6/15 14:34:23

四轮轮毂电机驱动车辆稳定性控制实战手记

四轮轮毂电机驱动车辆直接横摆力矩控制(DYC)&#xff0c;转矩矢量分配(TVC)的仿真搭建和控制整体采用分层控制策略。 其中顶层控制器的任务是利用车辆状态信息、横摆角速度以及质心侧偏角的误差计算出维持车辆稳定性的期望附加横摆力矩。 为了减少车辆速度影响&#xff0c;设计…

作者头像 李华
网站建设 2026/6/15 6:33:04

2025机器狗公司综合实力排行榜公布,智元AGIBOT强势“夺冠”

当前&#xff0c;机器狗&#xff0c;即四足智能机器人产业呈现出三个明显的发展趋势&#xff1a;一是技术集成度不断提升&#xff0c;AI算法与硬件系统的融合更加深入&#xff1b;二是应用场景不断拓展&#xff0c;从工业领域向公共安全、应急救援、科研教育等多元化领域延伸&a…

作者头像 李华