当前位置: 首页 > news >正文

LeetCode 面试经典 150_哈希表_两数之和(44_1_C++_简单)

LeetCode 面试经典 150_哈希表_两数之和(44_1_C++_简单)

    • 题目描述:
    • 输入输出样例:
    • 题解:
      • 解题思路:
        • 思路一(暴力破解法(双重循环)):
        • 思路二(哈希表):
      • 代码实现
        • 代码实现(思路一(暴力破解法)):
        • 代码实现(思路二(哈希表)):
        • 以思路二为例进行调试

题目描述:

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。

输入输出样例:

示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]

提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案

题解:

解题思路:

思路一(暴力破解法(双重循环)):

1、使用双重for循环枚举元素,一重for循环的变量代表一个数字下标,判断两数之和是否满足条件。
2、复杂度分析:
① 时间复杂度:O(n²),使用了双重循环。
② 空间复杂度:O(1)。我们只需常数空间存放若干变量。

思路二(哈希表):

1、通过题目分析,当一个数位置一定时,查找另一个数字,这时联想到了哈希表的快速查找。当遍历一个数字不满足条件之后将这个数字和下标存入哈希表,方便后续的查找。

2、具体思路如下:
① 创建哈希表用于快速的查找元素。
② 遍历数组,每遍历一个不满足条件的元素将 key=元素值;value=下标。
③ 在遍历数组的同时检查:key+nums[i] 是否=target,满足条件则返回此时的两个下标,也就是此时哈希表的value和nums的下标i。
④ 如果没有查找到返回空的容器

3、复杂度分析
① 时间复杂度:O(N),其中 N 是数组中的元素数量。因遍历一遍数组且哈希表的查找为O(1)
② 空间复杂度:O(N),其中 N 是数组中的元素数量。创建哈希表的空间。

代码实现

代码实现(思路一(暴力破解法)):
class Solution1 {
public:vector<int> twoSum(vector<int>& nums, int target) {int len=nums.size();for(int i=0;i<len;i++){for(int j=i+1;j<len;j++){if(nums[i]+nums[j]==target){//返回的是一个vector包含了i和j两个元素 return {i,j};}}}//return {}; 常用于返回默认构造的对象,尤其是类和标准库容器//返回一个空的容器 return {};}
};
代码实现(思路二(哈希表)):
class Solution2 {
public:// 定义一个函数 twoSum,接受一个整数数组 nums 和一个目标值 targetvector<int> twoSum(vector<int>& nums, int target) {// 使用 unordered_map 存储已访问过的元素及其索引unordered_map<int, int> mp;// 遍历整个数组for (int i = 0; i < nums.size(); i++) {// 检查当前元素是否能够和之前的元素加和等于目标值if (mp.count(target - nums[i])) {// 如果存在,则返回当前索引和之前找到的索引return {mp[target - nums[i]], i};}// 否则,保存当前元素及其索引到哈希表中mp[nums[i]] = i;}// 如果没有找到满足条件的两个数,返回空数组return {};}
};
以思路二为例进行调试
#include<iostream>
#include<vector>
using namespace std;
class Solution2 {
public:// 定义一个函数 twoSum,接受一个整数数组 nums 和一个目标值 targetvector<int> twoSum(vector<int>& nums, int target) {// 使用 unordered_map 存储已访问过的元素及其索引unordered_map<int, int> mp;// 遍历整个数组for (int i = 0; i < nums.size(); i++) {// 检查当前元素是否能够和之前的元素加和等于目标值if (mp.count(target - nums[i])) {// 如果存在,则返回当前索引和之前找到的索引return {mp[target - nums[i]], i};}// 否则,保存当前元素及其索引到哈希表中mp[nums[i]] = i;}// 如果没有找到满足条件的两个数,返回空数组return {};}
};
int main(){vector<int> nums={2,7,11,15};int target=9;Solution2 s;vector<int> results=s.twoSum1(nums,target);cout<<"["<<results[0]<<","<<results[1]<<"]";; return 0;
}

LeetCode 面试经典 150_哈希表_两数之和(44_1)原题链接
欢迎大家和我沟通交流(✿◠‿◠)

http://www.dtcms.com/a/395318.html

相关文章:

  • Kafka是什么,架构是什么样的?Kafka概述
  • TCN时序卷积网络、CNN、RNN、LSTM、GRU神经网络工业设备运行监测、航空客运量时间数据集预测可视化|附代码数据
  • 【HarmonyOS】HMRouter关键原理-动态import
  • 【Python】面向对象(三)
  • 05-django项目的跨域处理
  • go语言并发
  • Qt QSS 美化完整教程文档
  • jwt与token+redis,哪种方案更好用?
  • 基于react的前端项目开发和实战总结(umi框架)
  • 【iOS】YYModel
  • 修改docker配置使其支持本机tcp连接
  • ReportFragment:Android 生命周期的桥梁与兼容性解决方案
  • 力扣Hot100--234.回文链表
  • 视觉语言大模型(VLM)的产业落地:从Qwen-VL技术解析到医疗、车险行业革新
  • 零基础新手小白快速了解掌握服务集群与自动化运维(七)Nginx模块--Nginx Web服务
  • 一个硬盘选MBR 还是GPT
  • 【含文档+PPT+源码】基于GPT+SpringBoot的个人健康管理与咨询系统设计与实现
  • 【项目实战 Day5】springboot + vue 苍穹外卖系统(Redis + 店铺经营状态模块 完结)
  • 旧衣回收小程序:非技术视角下的价值重构与发展前景
  • 使用vue-i18n实现语言切换
  • 做小程序找哪家公司,解析小程序开发定制公司哪家适合你
  • 【python】python进阶——math模块
  • NHD-6108 全自动远、近光检测仪:智能高效的汽车灯光检测方案
  • 《 Linux 点滴漫谈: 一 》开源之路:Linux 的历史、演进与未来趋势
  • C#和微软System.Speech.Synthesis库实现语音合成
  • C++概述 (一)
  • 【开题答辩全过程】以 基于springboot的高校仪器共享管理系统设计和实现为例,包含答辩的问题和答案
  • 【python】FastAPI简介
  • IDEA lombok注解无效的问题,运行时提示java: 找不到符号或者方法
  • Windows 系统部署 Kronos 金融 K 线基础模型——基于 EPGF 架构