基础数学(二)两数之和 三数之和

news/2025/3/15 7:08:27/

目录

   两数之和_牛客题霸_牛客网

   三数之和_牛客题霸_牛客网


   两数之和_牛客题霸_牛客网

给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返回的下标按升序排列。

(注:返回的数组下标从1开始算起,保证target一定可以由数组里面2个数字相加得到)

数据范围:2≤len(numbers)≤1052≤len(numbers)≤105,−10≤numbersi≤109−10≤numbersi​≤109,0≤target≤1090≤target≤109

要求:空间复杂度 O(n)O(n),时间复杂度 O(nlogn)O(nlogn)

【解法一】枚举遍历 无法通过


class Solution {
public:vector<int> twoSum(vector<int>& numbers, int target) {// write code herevector<int> res;int n = numbers.size();for(int i = 0; i < n; i++){for(int j = i+1; j < n; j++){if(numbers[i]+numbers[j] == target){res.push_back(i+1);res.push_back(j+1);return res;}}}return res;}
};

【解法二】哈希存储

这道题让我对哈希表又有了新的认知,之前每次都是用hash来进行一个数出现的次数,于是会写出这样的  mp[arr[i]]++  ++表示这个数出现的次数加一,然而这道题把数与其在number中所对应的下标对应着存入map中。然后在后续遍历中,如果target-number[i]在map中存在可以直接返回我所需要的下标值。

时间复杂度O(N)  只需遍历一次数组,每次在哈希表中查找的时间复杂度为O(1)

空间复杂度为O(N) 创建map

class Solution {
public:vector<int> twoSum(vector<int>& numbers, int target) {// write code herevector<int> res;map<int, int> mp;int n = numbers.size();for(int i = 0; i < n; i++){int temp = target - numbers[i];if(mp.find(temp) == mp.end())mp[numbers[i]] = i;else{res.push_back(mp[temp]+1);res.push_back(i+1);break;}}return res;}
};

 三数之和_牛客题霸_牛客网

给出一个有n个元素的数组S,S中是否有元素a,b,c满足a+b+c=0?找出数组S中所有满足条件的三元组。

数据范围:0≤n≤10000≤n≤1000,数组中各个元素值满足 ∣val∣≤100∣val∣≤100

空间复杂度:O(n2)O(n2),时间复杂度 O(n2)O(n2)

注意:

  1. 三元组(a、b、c)中的元素必须按非降序排列。(即a≤b≤c)
  2. 解集中不能包含重复的三元组。

 将三数求和转化为二数求和来达到解题的目的,使用set接口进行去重。

class Solution {
public:vector<vector<int>> TwoSum(vector<int> num, int target, int begin){int n = num.size();vector<vector<int>> res;    // 用来返回结果数组for(int i = begin; i < n; i++){int _target = target-num[i];    // 将二数求和转化为找一个数if(find(num.begin()+i+1,num.end(),_target) != num.end()){// 利用#include<algorithm> 中find接口来进行查找// 找不到就返回num的end()vector<int> temp;temp.push_back(num[i]);   //如果找到了就把第二个数与第三个数都放入temp中      temp.push_back(_target);    res.push_back(temp);      //完成一次结果并放入res中,继续后续其他结果的查找}}return res;}vector<vector<int> > threeSum(vector<int> &num) {set<vector<int>> res;   // 用来去重的set容器vector<vector<int>> Res;    // 用来返回结果int n = num.size();if(n<3)return Res;  // 元素个数小于三个返回空sort(num.begin(), num.end());   // 进行一次排序整理for(int i = 0; i < n; i++){int target = 0-num[i];      // 把三数之和转化为俩数之和vector<vector<int>> temp = TwoSum(num, target, i+1);    // 多传一个下标参数 防止重复if(!temp.empty()){for(auto e : temp){e.insert(e.begin(), num[i]); // 在每组返回的数组最前方插入第一个数res.insert(res.end(), e);   // 将三个数的数组放入到set容器中进行去重}}}for(auto e : res)Res.push_back(e);   // 将set转移至Res中。return Res;}
};


http://www.ppmy.cn/news/12682.html

相关文章

一行代码加速Pytorch推理速度6倍

一行代码加速Pytorch推理速度6倍 Torch-TensorRT 是 PyTorch 的集成&#xff0c;它利用 NVIDIA GPU 上的 TensorRT 推理优化。 只需一行代码&#xff0c;它就提供了一个简单的 API&#xff0c;可在 NVIDIA GPU 上提供高达 6 倍的性能加速。 话不多说, 线上代码, 再解释原理!!…

LeetCode 334. 递增的三元子序列(C++)

思路&#xff1a; 1.对于任何位置&#xff0c;只需要满足i < j < k &#xff0c;使得 nums[i] < nums[j] < nums[k]&#xff1b;所以只需要记录每个元素的左边最小值leftMin[i]和右边最大值rightMax[i]&#xff0c;满足条件leftMin[i-1]<nums[i]<rightMax[i1…

SSL协议未开启是什么意思?

SSL协议未开启是指服务器中的服务没有开启或者没有SSL模块。在互联网中&#xff0c;数据交互传输基于http明文协议&#xff0c;随着互联网的不断发展&#xff0c;http协议展现出它的缺陷&#xff0c;通过http协议传输的数据容易被攻击者窃取、篡改或仿冒。为适应新形势下的网络…

MyBatis 详解 (2) -- 增删改操作

MyBatis 详解 2 -- 增删改操作前言一、准备工作1.1 创建数据库和表1.2 添加实体类1.3 添加 mapper 接口 (数据持久层)1.4 创建与接口对应的 xml 文件二、增加操作2.1 默认返回受影响的行数2.2 特殊的新增&#xff1a;返回自增 id三、删除操作四、修改操作五、实现完整交互5.1 添…

【Python学习】条件和循环

前言 往期文章 【Python学习】列表和元组 【Python学习】字典和集合 条件控制 简单来说&#xff1a;当判断的条件为真时&#xff0c;执行某种代码逻辑&#xff0c;这就是条件控制。 那么在讲条件控制之前&#xff0c;可以给大家讲一个程序员当中流传的比较真实的一个例子…

合作升级|Kyligence 跬智智能分析平台入选华为云联营商品

近日&#xff0c;Kyligence 跬智智能分析平台正式入选华为云联营商品&#xff0c;成为华为云在数据分析领域的联营合作伙伴。通过联营模式&#xff0c;双方将加深在产品、解决方案等多个领域的合作&#xff0c;携手打造“共生、共创、共营、共赢”的合作生态&#xff0c;为用户…

【每日一道智力题】之猴子搬香蕉

题目一个小猴子边上有100根香蕉&#xff0c;它要走过50米才能到家&#xff0c;每次它最多搬50根香蕉&#xff0c;&#xff08;多了就被压坏了&#xff09;&#xff0c;它每走1米就要吃掉一根&#xff0c;请问它最多能把多少根香蕉搬到家里。&#xff08;提示&#xff1a;他可以…

2023/1 寒假期间自学c++计划安排

寒假一期学习总结 寒假一期学习是在线下进行的&#xff0c;总的来说&#xff0c;非常充实&#xff0c;也很有收获&#xff0c;成体系的学习了 二分&#xff0c;高精度&#xff0c;函数&#xff0c;结构体&#xff0c;STL 等等内容&#xff0c;既开心有学到了知识。 在这7天的集…