【力扣Hot 100】回溯1

ops/2025/2/22 18:10:04/

1. 全排列

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

题解

class Solution {
public:void dfs(vector<int>& nums, vector<vector<int>>& ans, vector<bool>& used, vector<int>& path, int idx) {if(idx == nums.size()) {ans.push_back(path);return;}for(int i = 0; i < nums.size(); i ++ ) {if(used[i] == true) continue;used[i] = true;path[idx] = nums[i];dfs(nums, ans, used, path, idx + 1);used[i] = false;}}vector<vector<int>> permute(vector<int>& nums) {vector<vector<int>> ans;vector<bool> used(nums.size(), false);vector<int> path(nums.size());dfs(nums, ans, used, path, 0);return ans;}
};

2. 子集

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

题解

用二进制数表示 nums 的每个位置上的值是否在集合中

class Solution {
public:vector<vector<int>> subsets(vector<int>& nums) {vector<vector<int>> ans;vector<int> path;int n = nums.size();for(int mask = 0; mask < (1 << n); mask ++ ) {path.clear();for(int i = 0; i < n; i ++ ) {if(mask & (1 << i)) path.push_back(nums[i]);}ans.push_back(path);}return ans;}
};

3. 电话号码的组合

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

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

!https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2021/11/09/200px-telephone-keypad2svg.png

示例 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'] 的一个数字。

题解

class Solution {
public:vector<string> d2s = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};void dfs(vector<string>& ans, string& digits, int idx, string& path) {if(idx == digits.length()) {ans.push_back(path);return;}int c = digits[idx] - '2';for(int i = 0; i < d2s[c].length(); i ++ ) {path.push_back(d2s[c][i]);dfs(ans, digits, idx + 1, path);path.pop_back();}}vector<string> letterCombinations(string digits) {if(digits.size() == 0) return {};vector<string> ans;string path;int n = digits.size();dfs(ans, digits, 0, path);return ans;}
};

4. 组合总和

给你一个 无重复元素 的整数数组 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

题解

dfs函数中要枚举两种情况:

  1. 放该元素,要求放了后和应该小于等于target,再dfs(idx)
  2. 不放该元素,dfs(idx + 1)
class Solution {
public:void dfs(vector<vector<int>>& ans, vector<int>& path, vector<int>& candidates, int target, int sum, int idx) {if(idx == candidates.size()) return;if(sum == target) {ans.push_back(path);return;}// 不放dfs(ans, path, candidates, target, sum, idx + 1);// 放if(target >= sum + candidates[idx]) {path.push_back(candidates[idx]);dfs(ans, path, candidates, target, sum + candidates[idx], idx);path.pop_back();}}vector<vector<int>> combinationSum(vector<int>& candidates, int target) {vector<vector<int>> ans;vector<int> path;dfs(ans, path, candidates, target, 0, 0);return ans;}
};

http://www.ppmy.cn/ops/159831.html

相关文章

从零到一学习c++(基础篇--筑基期九-语句)

从零到一学习C&#xff08;基础篇&#xff09; 作者&#xff1a;羡鱼肘子 温馨提示1&#xff1a;本篇是记录我的学习经历&#xff0c;会有不少片面的认知&#xff0c;万分期待您的指正。 温馨提示2&#xff1a;本篇会尽量用更加通俗的语言介绍c的基础&#xff0c;用通俗的语言去…

智能协同:数据集成平台与DeepSeek驱动的数据分析与智能调度革新

前言 企业面临着海量数据的挑战与机遇。如何高效地整合多源数据、精准分析并智能决策&#xff0c;成为企业提升竞争力的关键。本文解析轻易云数据集成平台与DeepSeek技术结合在数据分析和智能调度方面的创新应用&#xff0c;揭示其为企业带来的高效、智能与精准的业务价值。 …

2025-02-18 学习记录--C/C++-PTA 7-24 约分最简分式

一、题目描述 ⭐️ 二、代码&#xff08;C语言&#xff09;⭐️ #include <stdio.h>int main() {int fenZi 0, // 分子fenMu 0; // 分母scanf("%d/%d",&fenZi,&fenMu);// 定义分子、分母两者中较小的那个值为minint min fenZi > fenMu ? fenMu…

华为昇腾 910B 部署 DeepSeek-R1 蒸馏系列模型详细指南

本文记录 在 华为昇腾 910B(65GB) * 8 上 部署 DeepSeekR1 蒸馏系列模型&#xff08;14B、32B&#xff09;全过程与测试结果。 NPU&#xff1a;910B3 (65GB) * 8 &#xff08;910B 有三个版本 910B1、2、3&#xff09; 模型&#xff1a;DeepSeek-R1-Distill-Qwen-14B、DeepSeek…

domain 网络安全

文章目录 1、域的概述 1.1、工作组与域1.2、域的特点1.3、域的组成1.4、域的部署概述1.5、活动目录1.6、组策略GPO 2、域的部署实验 2.1、建立局域网&#xff0c;配置IP2.2、安装活动目录2.3、添加用户到指定域2.4、将PC加入域2.5、实验常见问题 3、OU&#xff08;组织单位…

C#中的静态类以及常见用途

在C#中&#xff0c;静态类&#xff08;Static Class&#xff09; 是一种特殊的类&#xff0c;它不能被实例化&#xff0c;也不能被继承。静态类主要用于包含静态成员&#xff08;如静态方法、静态属性、静态字段等&#xff09;&#xff0c;这些成员可以直接通过类名访问&#x…

【CS.SE】优化 Redis 商户号池分配设计:高并发与内存管理

优化 Redis 商户号池分配设计&#xff1a;高并发与内存管理 背景 在分布式交易系统中&#xff0c;商户号池管理是核心模块之一。传统的商户号生成方式&#xff0c;依赖数据库预分配号段&#xff0c;导致大量号段浪费&#xff0c;并且在高并发请求下&#xff0c;性能难以满足需…

spring boot知识点2

1.spring boot 要开启一些特性&#xff0c;可通过什么方式开启 a.通过Enable注解&#xff0c;可启动定时服务 b.通过application.properties可设置端口号等地址信息 2.什么是热部署&#xff0c;以及spring boot通过什么方式进行热部署 热部署这个概念&#xff0c;我知道。就…