[C国演义] 第十三章

2023-10-06 12:06
文章标签 演义 第十三章

本文主要是介绍[C国演义] 第十三章,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第十三章

  • 三数之和
  • 四数之和

三数之和

力扣链接

根据题目要求:

  1. 返回的数对应的下标各不相同
  2. 三个数之和等于0
  3. 不可包含重复的三元组 – – 即顺序是不做要求的
    如: [-1 0 1] 和 [0, 1, -1] 是同一个三元组
  4. 输出答案顺序不做要求

暴力解法: 排序 + 3个for循环 + 去重 — — N^3, 肯定超时
优化: 排序 + 双指针 + 去重 — — N^2
优化的具体思路:
固定一个数, 记作a; 在剩余的空间里面找和为 -a的两个数(由于是排好序的, 所以使用双指针)
去重有两种方法:
1.set去重
2 在循环内部缩小空间 — — 非常值得我们去尝试

  1. set去重
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {// 排序sort(nums.begin(), nums.end());// 记录结果vector<vector<int>> res; // 固定一个数 + 双指针int n = nums.size();for(int i = 0; i < n; i++) // 固定一个数{// 双指针优化int left = i+1, right = n-1;int targt = -nums[i];while(left < right){int sum = nums[left] + nums[right];if(sum < targt){left++;}else if(sum > targt){right--;}else{res.push_back({nums[i], nums[left], nums[right]});left++;right--;}}}// 去重set<vector<int>> result(res.begin(), res.end());res.clear();for(auto e : result){res.push_back(e);}return res;}
};


上面的运行结果太慢了, 我们尝试一下 缩小空间去重👇👇👇

  1. 缩小空间去重
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {// 排序sort(nums.begin(), nums.end());// 记录结果vector<vector<int>> res; // 固定一个数 + 双指针int n = nums.size();for(int i = 0; i < n;) // 固定一个数{// 双指针优化int left = i+1, right = n-1;int targt = -nums[i];while(left < right){int sum = nums[left] + nums[right];if(sum < targt){left++;}else if(sum > targt){right--;}else{res.push_back({nums[i], nums[left], nums[right]});left++;right--;// 去重left 和 rightwhile(left < right && nums[left] == nums[left-1])  left++;while(right > left && nums[right] == nums[right+1])  right--;}}// 去重ii++;while(i < n && nums[i] == nums[i-1])  i++;}return res;}
};



四数之和

力扣链接

这一题就跟上面的题目相似, 思路也很相似: 排序 + 固定两个数, 双指针优化 + 去重. 当然, 我们这里的去重逻辑也是 缩小空间去重

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {sort(nums.begin(), nums.end());vector<vector<int>> res;int n = nums.size();// 选定一个数, 内部用三数之和for(int i = 0; i < n;){// 选定一个数, 内部使用双指针优化for(int j = i+1; j < n;){int left = j+1, right = n-1;long int tar = target - (long int)(nums[i]+nums[j]);while(left < right){long int cur = nums[left] + nums[right];if(cur < tar)  left++;else if(cur > tar)  right--;else{res.push_back({nums[i], nums[j], nums[left], nums[right]});left++, right--;// 去重left 和 rightwhile(left < right && nums[left] == nums[left-1])  left++;while(right > left && nums[right] == nums[right+1])  right--;}}// j的去重j++;while(j < n && nums[j] == nums[j-1])  j++;}// i的去重i++;while(i < n && nums[i] == nums[i-1])  i++;}return res;}
};


号令风霆迅,天声动北陬。
长驱渡河洛,直捣向燕幽。
马蹀阏氏血,旗袅可汗头。
归来报明主,恢复旧神州。 — — [宋] 岳飞 <送紫岩张先生北伐>

这篇关于[C国演义] 第十三章的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/153016

相关文章

WPF入门到跪下 第十三章 3D绘图 - 3D绘图基础

3D绘图基础 四大要点 WPF中的3D绘图涉及4个要点: 视口,用来驻留3D内容3D对象照亮部分或整个3D场景的光源摄像机,提供在3D场景中进行观察的视点 一、视口 要展示3D内容,首先需要一个容器来装载3D内容。在WPF中,这个容器就是Viewport3D(3D视口),它继承自FrameworkElement,因此可以像其他元素那样在XAML中使用。 Viewport3D与其他元素相

第十三章_异步处理

13.1、概述 计算机的内存是有限的。Servlet/JSP容器的设计者很清楚这一点,因此他们提供了一些可以进行配置的设置,以确保容器能够在宿主机器中正常运行。例如,在Tomcat7中,处理进来请求的最多线程数量为200。如果是多处理器的服务器,则可以放心地增加线程数量,不过建议你还是尽量使用这个默认值。 Servlet或Filter一直占用着请求处理线程,直到它完成任务。如果完成任务花费了很

AWS无服务器 应用程序开发—第十三章 小结2

电子邮件发送(Amazon SES、Amazon SNS、AWS Lambda) 注意点和易错点 SES 配置:确保域名验证和 DKIM 签名配置正确,避免邮件被标记为垃圾邮件。 SNS 配置:订阅和发布权限需要配置正确。 Lambda 权限:确保 Lambda 函数有正确的执行权限。 移除沙盒:需要大量发送邮件的时候,必须移除沙盒。不然每天的限制200封邮件。发送速率限制为每秒 1 封电子邮

JUC并发编程第十三章——读写锁、邮戳锁

本章路线总纲 无锁——>独占锁——>读写锁——>邮戳锁 1 关于锁的面试题 你知道Java里面有那些锁你说说你用过的锁,锁饥饿问题是什么?有没有比读写锁更快的锁StampedLock知道吗?(邮戳锁/票据锁)ReentrantReadWriteLock有锁降级机制,你知道吗? 2 简单聊聊ReentrantReadWriteLock 类图: 读写锁的演变情况: 2.1 是什么

2024.06.12【读书笔记】丨生物信息学与功能基因组学(第十三章 病毒基因组 第四部分)【AI测试版】

读书笔记:《生物信息学与功能基因组学》第十三章 - 第四部分 摘要 本部分深入探讨了生物信息学在病毒基因组研究中的具体应用案例,包括对人类免疫缺陷病毒(HIV)和麻疹病毒的分析。讨论了生物信息学工具在理解病毒复制、致病机制、抗药性发展以及疫苗设计中的作用。同时,还介绍了网络上可用于病毒研究的资源和数据库。 目录 生物信息学在病毒研究中的应用案例人类免疫缺陷病毒(HIV)的生物信息学分析麻疹

2024.06.11【读书笔记】丨生物信息学与功能基因组学(第十三章 病毒基因组 第二部分)【AI测试版】

读书笔记:《生物信息学与功能基因组学》第十三章 - 第二部分 摘要 本部分深入探讨了病毒的生物分类学,特别是基于核酸组成的病毒分类方法。介绍了病毒基因组的多样性,包括基因组大小、形态和复制策略。此外,还讨论了生物信息学在病毒基因组研究中的应用,如序列分析、系统发育重建和疫苗设计。 目录 病毒的核酸组成与分类病毒基因组的多样性生物信息学在病毒基因组研究中的应用病毒基因组的生物信息学分析方法

第十三章 迭代器、生成器、 装饰器

一、可迭代对象 1. 容器类(能存放多个元素的数据类型):     ① 序列:字符串、列表、元组、字节     ② 字典     ③ 集合     # 组件:开发社区写的一堆类      2. 迭代对象iteration     --- 可进行遍历的对象     > 可迭代对象都是Iterable的扩展类(子类、衍生类,派生类)     > 重写了__iter__(self),

第十三章数据质量练习

单选题 (每题1分,共25道题) 1、 [单选] 请从下列描述中选择一个正确的选项。 A:数据质量管理是数据治理的代名词 B:数据质量管理仅处理结构化数据 C:数据质量管理通常是一次性的项目 D:数据质量管理是一个持续的过程 正确答案:D 你的答案:D 解析:346页最后一行,描述的是正确答案D选项。另外在DAMA中,数据质量管理是指为确保满足数据消费者的需求,应用数据管理技术进行规划、实施和

《21天学通C++》(第十三章) 类型转换运算符

1.为什么需要类型转换? ①兼容不同类型: 在C++中不同类型的数据不能直接进行运算,如需要则要进行类型转换 ②指针转换: 在处理指针时,经常需要把一个类型的指针转化为另一个类型的指针 ③与C语言兼容: C++兼容C语言,有时候需要把C++的类型数据转换为C语言的数据类型 ④ 函数重载、类继承、提高表达式性能 、处理多态 、实现特定编程技巧 2.C++有哪些类型转换运算符 ①静态类型转

React 第十三章 属性默认值和类型验证

1. 属性默认值和类型验证 在 Vue 中,我们可以针对 props 属性进行类型验证,那么在 React 中同样也能对 props 进行验证。官网文档。 从 React v15.5 开始,React.PropTypes 已移入另一个包中。因此首先我们需要安装 prop-types 库。 验证类型 有关 props 能够验证的类型,官网实际上已经全部罗列出来了。 对应地址:https:/