代码随想录刷题题Day21

刷题的第二十一天,希望自己能够不断坚持下去,迎来蜕变。😀😀😀
刷题语言:C++
Day21 任务
● 216.组合总和III
● 17.电话号码的字母组合

1 组合总和III

216.组合总和III
在这里插入图片描述
思路:

在[1,2,3,4,5,6,7,8,9]这个集合中找到和为n的k个数的组合

在这里插入图片描述
(1)确定递归函数参数,返回值
返回值:void
参数:目标和n,k,sum(已经收集的元素的总和),startIndex

vector<vector<int>> result;
vector<int>path;
void backtracking(int n, int k, int sum, int startIndex)

(2)确认终止条件

if (path.size() == k) {
	if (sum == n) result.push_back(path);
	return;
}

(3)单层搜索过程

path收集每次选取的元素,sum来统计path里元素的总和

for (int i = startIndex; i <= 9; i++) {
	sum += i;
	path.push_back(i);
	backtracking(n, k, sum, i + 1); // 注意i+1调整startIndex
	sum -= i;// 回溯
	path.pop_back();// 回溯
}

C++:

class Solution {
public:
    vector<vector<int>> result;// 存放结果集
    vector<int> path;// 符合条件的结果
    void traversal(int n, int k, int sum, int startIndex) {
        if (path.size() == k) {
            if (sum == n) result.push_back(path);
            return;// 如果path.size() == k 但sum != targetSum 直接返回
        }
        for (int i = startIndex; i <= 9; i++) {
            sum += i;// 处理
            path.push_back(i);// 处理
            traversal(n, k, sum, i + 1);// 注意i+1调整startIndex
            sum -= i;// 回溯
            path.pop_back();// 回溯
        }

    }
    vector<vector<int>> combinationSum3(int k, int n) {
        traversal(n, k, 0, 1);
        return result;
    }
};

剪枝优化:
(1)已选元素总和如果已经大于n,那么往后遍历就没有意义

剪枝的地方可以放在递归函数开始的地方

if (sum > n) return;

(2)for循环的范围也可以剪枝,i <= 9 - (k - path.size()) + 1

剪枝优化C++:

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    void traversal(int n, int k, int sum, int startIndex) {
    	if (sum > n) return;
        if (path.size() == k) {
            if (sum == n) result.push_back(path);
            return;
        }
        for (int i = startIndex; i <= 9 - (k - path.size()) + 1; i++) {
            sum += i;
            path.push_back(i);
            traversal(n, k, sum, i + 1);
            sum -= i;
            path.pop_back();
        }

    }
    vector<vector<int>> combinationSum3(int k, int n) {
        traversal(n, k, 0, 1);
        return result;
    }
};

2 电话号码的字母组合

17.电话号码的字母组合
在这里插入图片描述

(1)数字和字母如何映射
(2)用for循环写不出来
(3)输入1 * #按键等等异常情况

思路:

  1. 数字和字母如何映射
    使用map或者定义一个二维数组
const string[10] = {
	"", // 0
	"", // 1
	"abc", // 2
	"def", // 3
	"ghi", // 4
	"jkl", // 5
	"mno", // 6
	"pqrs",// 7
	"tuv", // 8
	"wxyz",// 9
};
  1. 回溯法来解决n个for循环的问题
    在这里插入图片描述
    (1)确定回溯函数参数
    参数:digits,index(记录遍历第几个数字)
vector<string> result;
string s;
void backtracking(const string& digits, int index)

(2)确定终止条件

if (index == digits.size()) {
	result.push_back(s);
	return;
}

(3)确定单层遍历逻辑
1)首先要取index指向的数字,并找到对应的字符集。
2)然后for循环来处理这个字符集

int digit = digits[index] - '0';
string letters = letterMap[digit];
for (int i = 0; i < letter.size(); i++) {
	s.push_back(letters[i]);
	backtracking(digits, index + 1);
	s.pop_back();
}

C++:

class Solution {
public:
	const string letterMap[10] = {
		"", // 0
		"", // 1
		"abc", // 2
		"def", // 3
		"ghi", // 4
		"jkl", // 5
		"mno", // 6
		"pqrs",// 7
		"tuv", // 8
		"wxyz" // 9
	};
	string s;
	vector<string> result;
	void backtracking(const string& digits, int index)
	{
		if (index == digits.size()) {
			result.push_back(s);
			return;
		}
		int digit = digits[index] - '0';// 将index指向的数字转为int
		string letters = letterMap[digit];// 取数字对应的字符集
		for (int i = 0; i < letters.size(); i++) {
			s.push_back(letters[i]);// 处理
			backtracking(digits, index + 1); // 递归,注意index+1,一下层要处理下一个数字
			s.pop_back();// 回溯
		}
	}
    vector<string> letterCombinations(string digits) {
		s.clear();
		result.clear();
		if (digits.size() == 0) return result;
		backtracking(digits, 0);
		return result;
    }
};

时间复杂度: O ( 3 m ∗ 4 n ) O(3^m * 4^n) O(3m4n)

m 是对应四个字母的数字个数,n 是对应三个字母的数字个数

空间复杂度: O ( 3 m ∗ 4 n ) O(3^m * 4^n) O(3m4n)


鼓励坚持二十二天的自己😀😀😀

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据孤岛:一场数据的独立战争

在当今数字化的时代&#xff0c;数据已成为企业和组织最宝贵的资产之一。然而&#xff0c;尽管数据的价值被广泛认可&#xff0c;但数据的分散和孤立问题却仍然存在&#xff0c;这就是所谓的数据孤岛。本文将重点分析什么是数据孤岛、数据孤岛的危害以及解决数据孤岛的传统和创…

C语言课程设计_运动会管理系统

本次课程设计利用《C语言程序设计》课程中所学到的编程知识和编程技巧&#xff0c;完成具有一定难度和工作量的程序设计题目&#xff0c;帮助学生掌握编程、调试的基本技能&#xff0c;独立完成所布置的任务。 要求 1、对系统进行功能需求分析 2、设计合理的数据结构和系统框…

分类预测 | Matlab实现MTF-CNN-Mutilhead-Attention基于马尔可夫转移场-卷积神经网络融合多头注意力多特征数据分类预测

分类预测 | Matlab实现MTF-CNN-Mutilhead-Attention基于马尔可夫转移场-卷积神经网络融合多头注意力多特征数据分类预测 目录 分类预测 | Matlab实现MTF-CNN-Mutilhead-Attention基于马尔可夫转移场-卷积神经网络融合多头注意力多特征数据分类预测分类效果基本描述程序设计参考…

HarmonyOS4.0系统性深入开发03UIAbility组件详解(中)

UIAbility组件基本用法 UIAbility组件的基本用法包括&#xff1a;指定UIAbility的启动页面以及获取UIAbility的上下文UIAbilityContext。 指定UIAbility的启动页面 应用中的UIAbility在启动过程中&#xff0c;需要指定启动页面&#xff0c;否则应用启动后会因为没有默认加载…

2024华为OD机试真题指南宝典—持续更新(JAVAPythonC++JS)【彻底搞懂算法和数据结构—算法之翼】

PC端可直接搜索关键词 快捷键&#xff1a;CtrlF 年份关键字、题目关键字等等 注意看本文目录-快速了解本专栏 文章目录 &#x1f431;2024年华为OD机试真题&#xff08;马上更新&#xff09;&#x1f439;2023年华为OD机试真题&#xff08;更新中&#xff09;&#x1f436;新…

Python字符串处理全攻略(三):常用内置方法轻松掌握

目录 引言Python字符串常用内置方法str.index()功能介绍语法注意事项总结 str.startswith()功能介绍语法示例注意事项 str.expandtabs()功能介绍语法示例注意事项总结 str.splitlines()功能介绍语法示例注意事项总结 str.swapcase()功能介绍语法示例注意事项 结束语 引言 欢迎…

XUbuntu22.04之跨平台容器格式工具:MKVToolNix(二百零三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

【Hadoop】Zookeeper是什么?怎么理解它的工作机制?

Zookeeper是什么Zookeeper工作机制 Zookeeper是什么 Zookeeper是一个开源的分布式的&#xff0c;为别的分布式矿建提供协调服务的Apache项目。分布式简单地理解就是多台机器共同完成一个任务。 Zookeeper工作机制 从设计模式的角度来理解&#xff0c;是一个基于观察者模式设…

css学习笔记6(盒子模型)

CSS盒子模型 五、CSS盒子模型1.CSS长度单位2.元素的显示模式3.总结各元素的显示模式4.修改元素显示模式5.盒子模型的组成6.盒子内容区&#xff08;content&#xff09;7.关于默认宽度8.盒子内边距&#xff08;padding&#xff09;9.盒子边框&#xff08;border&#xff09;10.盒…

深度学习入门(python)考试速成均方误差

均方误差 表示神经网络的输出&#xff0c;表示监督数据&#xff0c;表示数据的维度。 这里神经网络的输出y是softmax函数的输出 数组元素的索引从第一个开始依次对应数组“0”&#xff0c;“1”&#xff0c;“2”&#xff0c;...... 由于softmax函数的输出可理解为概率 由此…

指针的含义

我们还取前面图片解释的道理&#xff1a; pa表示的意思就是这个地址&#xff0c;并不会显示出10这个数字 *pa就是指针&#xff0c;最后指向了a10&#xff0c;所以他最后程序输出是10 &pa这个含义就是取pa的地址&#xff0c;那么pa是一个虚拟的地址&#xff0c;只是简单的…

概率中的50个具有挑战性的问题[02/50]:连续获胜

一、说明 我最近对与概率有关的问题产生了兴趣。我偶然读到了弗雷德里克莫斯特勒&#xff08;Frederick Mosteller&#xff09;的《概率论中的五十个具有挑战性的问题与解决方案》&#xff08;Fifty Challenge Problems in Probability with Solutions&#xff09;一书。我认为…

python实现图像的几何变换——冈萨雷斯数字图像处理

1、 实现图像的平移。 原理: 图像的平移是一种基本的图像处理操作&#xff0c;它将图像中的每个像素沿着指定的方向和距离移动&#xff0c;以创建一个新的平移后的图像。平移的原理很简单&#xff0c;通常涉及到以下几个步骤&#xff1a; 确定平移的距离和方向&#xff1a;首先…

2024苹果手机iOS管理软软件iMazing2.17永久免费版下载教程

iMazing2024是一款专业的苹果IOS设备管理器&#xff0c;强悍的性能远超苹果的iTunes&#xff0c;iMazing 能让广大果粉能已自己的方式管理苹果设备&#xff0c;无需iTunes即可畅快传输或者保存苹果设备中的音乐、消息、文件以及其他数据。 iMazing2Mac-最新绿色安装包下载如下&…

下一站,上岸@24考研er

时间过的好快&#xff0c; 考研倒计时①天 去年这个时候&#xff0c; 我应该也是充满未知地进入即将来到的考研初试 去年&#xff0c;这个时候&#xff0c;疫情&#x1f637;刚刚放开 许多人都&#x1f411;&#xff0c;发烧&#xff0c;可幸的是我受影响不大 &#x1f3…

供应链 | 顶刊MSOM论文精选——关税对全球供应链网络配置的影响:模型、预测和未来研究

编者按 关税对企业全球供应链网络设计决策的影响 本文为 M&SOM期刊20周年特邀论文&#xff0c;原文信息&#xff1a; Lingxiu Dong, Panos Kouvelis (2020) Impact of Tariffs on Global Supply Chain Network Configuration: Models, Predictions, and Future Research…

MySQL 数据库系列课程 05:MySQL命令行工具的配置

一、Windows启动命令行工具 &#xff08;1&#xff09;打开 Windows 的开始菜单&#xff0c;找到安装好的 MySQL&#xff0c;点击MySQL 8.0 Command Line Client - Unicode&#xff0c;这个带有 Unicode 的&#xff0c;是支持中文的&#xff0c;允许在命令行中敲中文。 &…

Java经典面试题——手写快速排序和归并排序

题目链接&#xff1a;https://www.luogu.com.cn/problem/P1177 输入模板&#xff1a; 5 4 2 4 5 1快速排序 技巧&#xff1a;交换数组中的两个位置 a[l] a[l] a[r] - (a[r] a[l]); 稳定不稳定&#xff1f;:不稳定 注意找哨兵那里内循环的等于号不能漏&#xff0c;不然…

【STM32】I2C通信

基本的任务是&#xff1a;通过通信线&#xff0c;实现单片机读写外挂模块寄存器的功能。其中至少要实现在指定位置写寄存器和在指定的位置读寄存器这两个功能。 异步时序的优点&#xff1a;省一根时钟线&#xff0c;节约资源&#xff1b;缺点&#xff1a;对事件要求严格&#…

VSCode运行时弹出powershell

问题 安装好了vscode并且装上code runner插件后&#xff0c;运行代码时总是弹出powershell,而不是在vscode底部终端 显示运行结果。 解决方法 打开系统cmd ,在窗口顶部条右击打开属性&#xff0c;把最下面的旧版控制台选项取消&#xff0c;即可