代码随想录刷题题Day21

news2024/12/23 22:13:28

刷题的第二十一天,希望自己能够不断坚持下去,迎来蜕变。😀😀😀
刷题语言: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)


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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

P5 RV1126编码测试Demo

目录 前言 01 测试Demo大致流程图 02 代码分析 2.1 VI设备初始化 2.2 使能通道 —— RK_MPI_VI_EnableChn 2.3 VI 和 VENC绑定 2.4 创建 编码线程 前言 从本章开始我们将要学习嵌入式音视频的学习了 &#xff0c;使用的瑞芯微的开发板 &#x1f3ac; 个人主页&#xff1a…

JavaEE:CAS详解

一.什么是CAS CAS: 全称 Compare and swap &#xff0c;字面意思 :” 比较并交换 “ &#xff0c;一个 CAS 涉及到以下操作&#xff1a; 我们假设内存中的原数据V&#xff0c;旧的预期值A&#xff0c;需要修改的新值B。 我们来进行操作&#xff1a; 1. 比较 V 和 A 是否相等。…

Java多线程、线程池及线程同步(synchronized关键字、悲观锁、乐观锁)

1.进程与线程定义 进程包含线程&#xff0c;如一个百度网盘进程&#xff0c;该进程的线程可以有上传&#xff0c;下载。 2.创建线程的三种方式 方式1-继承Thread类 方式2-实现Runnabled接口 1.常规写法 2.匿名内部类写法 方式3-实现Callable接口 示例代码&#xff1a; f1.get…

WorkPlus超级APP助力企业节省IT人力成本,实现快速移动化

在信息化时代&#xff0c;移动应用已经成为企业发展的重要组成部分。然而&#xff0c;开发和维护原生客户端的成本却相对较高&#xff0c;需要大量的iOS、安卓和桌面端工程师。为了解决这一问题&#xff0c;WorkPlus作为一个功能完备的超级APP&#xff0c;为企业节约了大量的IT…

MyBatis动态sql中foreach标签介绍和使用

MyBatis动态sql中foreach标签介绍和使用 参数解释&#xff1a; foreach 的主要作用在构建 in 条件中&#xff0c;它可以在 sql 语句中进行迭代一个集合。foreach 元素的属性主要有 collection&#xff0c;item&#xff0c;separator&#xff0c;index&#xff0c;open&#x…

Github 2023-12-24 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2023-12-24统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目5Jupyter Notebook项目2C项目1C项目1Go项目1Java项目1JavaScript项目1Ruby项目1 Serverless Frame…

探索微软Edge:使用方法和心得分享

学习目标&#xff1a; 了解微软Edge的基本功能和使用方法。掌握在微软Edge上进行浏览、搜索和书签管理的技巧。学习如何使用微软Edge进行隐私和安全管理。探索微软Edge的扩展和其他高级功能。 学习内容&#xff1a; 微软Edge的简介&#xff1a;了解微软Edge的起源、特点和与其…

AI一键注释代码、阅读整个项目、转换编程语言。已开源!

获取github源码地址和国内url、key方式&#xff1a;在文章底部 大家好今天给大家介绍一款开源项目&#xff0c;这个项目是由渡码维护的&#xff0c;这个项目支持自己的大模型和使用openai两种方式&#xff0c;本文章介绍使用openai的方式&#xff01; 使用过程中发现两个问题…

如何利用flume进行日志采集

介绍 Apache Flume 是一个分布式、可靠、高可用的日志收集、聚合和传输系统。它常用于将大量日志数据从不同的源&#xff08;如Web服务器、应用程序、传感器等&#xff09;收集到中心化的存储或数据处理系统中。 基本概念 Agent&#xff08;代理&#xff09;&#xff1a; …

【JAVA面试题】什么是引用传递?什么是值传递?

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 前言 博客的正文部分可以详细介绍Java中参数传递的机制&#xff0c;强调Java是按值传递的&#xff0c;并解释了基本数据类型和对象引用在这种传…

【FPGA】分享一些FPGA视频图像处理相关的书籍

在做FPGA工程师的这些年&#xff0c;买过好多书&#xff0c;也看过好多书&#xff0c;分享一下。 后续会慢慢的补充书评。 【FPGA】分享一些FPGA入门学习的书籍【FPGA】分享一些FPGA协同MATLAB开发的书籍 【FPGA】分享一些FPGA视频图像处理相关的书籍 【FPGA】分享一些FPGA高速…

每次maven刷新jdk都要重新设置

pom.xml <java.version>17</java.version> 改为<java.version>1.8</java.version>

【BBuf的CUDA笔记】十,Linear Attention的cuda kernel实现解析

欢迎来 https://github.com/BBuf/how-to-optim-algorithm-in-cuda 踩一踩。 0x0. 问题引入 Linear Attention的论文如下&#xff1a; Transformers are RNNs: Fast Autoregressive Transformers with Linear Attention&#xff1a;https://arxiv.org/pdf/2006.16236.pdf 。官方…

WPF中DataContext的绑定技巧-粉丝专栏

&#xff08;关注博主后&#xff0c;在“粉丝专栏”&#xff0c;可免费阅读此文&#xff09; 先看效果&#xff1a; 上面的绑定值都是我们自定义的属性&#xff0c;有了以上的提示&#xff0c;那么我们可以轻松绑定字段&#xff0c;再也不用担心错误了。附带源码。 …

Python学习路线 - Python语言基础入门 - Python基础综合案例 - 数据可视化 - 地图可视化

Python学习路线 - Python语言基础入门 - Python基础综合案例 - 数据可视化 - 地图可视化 基础地图使用基础地图演示基础地图演示 - 视觉映射器 疫情地图-国内疫情地图案例效果数据整理 疫情地图-省级疫情地图省疫情地图 基础地图使用 基础地图演示 代码示例&#xff1a; &quo…

【c++、数据结构课设】哈夫曼树

时间过的真快&#xff0c;转眼之间一个学期即将结束&#xff0c;想必这个时候大家都在准备各科的课设作业&#xff0c;本期内容是我的数据结构课设&#xff0c;希望能给大家带来帮助&#xff0c;如果有任何不足或需要改进的地方&#xff0c;欢迎各位提出宝贵的意见。 屏幕录制2…

2023年12月24日学习总结

今日to do list&#xff1a; 做kaggle上面的流量预测项目☠️ 学习时不刷手机&#x1f921; okkkkkkkkkkkkkk 开始&#x1f44d;&#x1f34e; 0、我在干什么&#xff1f; 我在预测一个名字叫做elborn基站的下行链路流量&#xff0c;用过去29天的数据预测未来10天的数据 1、…

Json和Xml

一、前言 学习心得&#xff1a;C# 入门经典第8版书中的第21章《Json和Xml》 二、Xml的介绍 Xml的含义&#xff1a; 可标记性语言&#xff0c;它将数据以一种特别简单文本格式储存。让所有人和几乎所有的计算机都能理解。 XML文件示例&#xff1a; <?xml version"1.…

HarmonyOS - 基础组件绘制

文章目录 所有组件开发 tipsBlankTextImageTextInputButtonLoadingProgress 本文改编自&#xff1a;<HarmonyOS第一课>从简单的页面开始 https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101667360160710997 所有组件 在 macOS 上&#xff0c;组…

原来电脑并不需要重装系统才能恢复出厂设置,这个操作学起来!

前言 小伙伴们应该都知道手机上有恢复出厂设置的功能&#xff0c;如果想要把手机送给朋友或者卖给别人&#xff0c;就会先恢复出厂设置。 但换到Windows电脑上之后&#xff0c;如果出现同样的情况&#xff0c;就会第一时间想到重装系统。就好像Windows电脑上不存在恢复出厂设…